我有如下代码:
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)attrDictionary,(CFTypeRef *)&value);
这导致错误:
Implicit conversion of an indirect pointer to an Objective-C pointer to 'CFTypeRef *' (aka 'const void **') is disallowed with ARC
关于如何解决这个问题的任何想法?我已经尝试将CFTypeRef *更改为id *,但没有解决
这是完整的方法:
+ (NSData *)keychainValueForKey:(NSString *)key { if (key == nil) { return nil; } NSMutableDictionary *attrDictionary = [self attributesDictionaryForKey:key]; // Only want one match [attrDictionary setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit]; // Only one value being searched only need a bool to tell us if it was successful [attrDictionary setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData]; NSData *value = nil; OSStatus status = SecItemCopyMatching((CFDictionaryRef)attrDictionary,(CFTypeRef *)&value); if (status != errSecSuccess) { DLog(@"KeychainUtils keychainValueForKey: - Error finding keychain value for key. Status code = %d",status); } return [value autorelease]; }
解决方法
你可以将其转换为void *:
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)attrDictionary,(void *)&value);
如果您使用Objective-C,则可能需要转换两次:
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)attrDictionary,(CFTypeRef *)(void *)&value);
或者你可以使用一个临时变量:
CFTypeRef cfValue = NULL; OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)attrDictionary,&cfValue); NSData *value = (__bridge id)cfValue;