iphone – 转移到Objective-C指针的间接指针

我有如下代码:

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;

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...