iPhone从钥匙串中获取数据字典

Luk*_*gan 9 iphone dictionary keychain automatic-ref-counting

所以我正在尝试将旧项目转换为自动引用计数.我正在尝试使用xCode所具有的转换工具,但它说要在转换之前解决一些问题.我不知道如何解决这个错误.它是在keychain文件的实现中.此方法是返回错误的方法,特别是具有SecItemCopyMatching的行.我得到的错误说:"使用ARC来禁止使用指向'CFTypeRef*'(又名'const void**')的Objective-C指针的间接指针.我一直在寻找google,apple docs,和一堆其他垃圾,找不到更好的方法来获取钥匙串中的现有数据字典.任何帮助赞赏.谢谢!

-(NSMutableDictionary*)fetchDictionary {

NSMutableDictionary *genericPasswordQuery = [self buildSearchQuery];

NSMutableDictionary *outDictionary = nil;
OSStatus status = SecItemCopyMatching((__bridge_retained  CFDictionaryRef)genericPasswordQuery, (CFTypeRef*)&outDictionary);

if (DEBUG) printf("FETCH: %s\n", [[self fetchStatus:status] UTF8String]);

if (status == errSecItemNotFound) return NULL;
return outDictionary;
Run Code Online (Sandbox Code Playgroud)

}

Kar*_*tey 42

您不需要为此禁用ARC; 你只需要将查询的结果声明为a CFDictionaryRef,然后NSDictionary在调用后将其转换为a .

/*1*/ CFDictionaryRef cfquery = (__bridge_retained CFDictionaryRef)genericPasswordQuery;
/*2*/ CFDictionaryRef cfresult = NULL;
/*3*/ OSStatus status = SecItemCopyMatching(cfquery, (CFTypeRef *)&cfresult);
/*4*/ CFRelease(cfquery);
/*5*/ NSDictionary *result = (__bridge_transfer NSDictionary *)cfresult;
Run Code Online (Sandbox Code Playgroud)

几言:

  • 在第1行中,我们将查询从Cocoa土地转换为Core Foundation国家/地区.我们使用它__bridge_retained来确保ARC在我们使用它时不释放和释放对象.这种桥接铸件保留了物体,因此为防止泄漏,必须遵循相应的CFRelease某处.SecItemCopyMatching肯定不会为我们发布查询,所以如果我们使用保留桥,那么我们需要自己发布生成的Core Foundation对象.(我们在第4行做)
  • 第2,3和4行是使用Core Foundation类型的纯C代码,因此ARC将无所事事或抱怨它们.
  • 在第5行中,我们告诉ARC SecItemCopyMatching已创建其结果,保留计数为1,我们负责释放.(我们知道这是因为它的名字中有"复制".)__bridge_transfer让ARC知道这个责任,所以它能够自动为我们做.
  • 不要将SecItemCopyMatching返回的不可变Core Foundation字典强制转换为NSMutableDictionary; 那是错的.此外,它反对buildSearchQuery返回一般的Cocoa样式约定NSMutableDictionary.简单的NSDictionarys在两种情况下都能正常工作.

这里的经验法则是__bridge_retained需要后跟a CFRelease,而"复制"或"创建"函数的结果必须使用__bridge_transfer.