2012-09-13 7 views
9

Ich habe den folgenden Code:Besetzung von indirekten Zeigern auf einen Objective-C-Zeiger

OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)attrDictionary, (CFTypeRef *)&value); 

, die einen Fehler von verursacht:

Implicit conversion of an indirect pointer to an Objective-C pointer to 'CFTypeRef *' (aka 'const void **') is disallowed with ARC 

Jede Idee, wie man dieses Problem lösen? Ich habe versucht, CFTypeRef * zu einem id * ändern, aber es hat nicht geklappt

Hier ist die vollständige Methode:

+ (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]; 
} 

Antwort

27

Sie können es einfach zu gieße void *:

OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)attrDictionary, 
    (void *)&value); 

Wenn Sie Wenn Sie Objective-C++ verwenden, müssen Sie es wahrscheinlich zweimal umwandeln:

OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)attrDictionary, 
    (CFTypeRef *)(void *)&value); 

Oder Sie können eine temporäre Variable verwenden:

CFTypeRef cfValue = NULL; 
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)attrDictionary, &cfValue); 
NSData *value = (__bridge id)cfValue;