Iphone 将间接指针强制转换为Objective-C指针

Iphone 将间接指针强制转换为Objective-C指针,iphone,objective-c,ios,ipad,Iphone,Objective C,Ios,Ipad,我有以下代码: 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 wi

我有以下代码:

 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;