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)
几言:
__bridge_retained
来确保ARC在我们使用它时不释放和释放对象.这种桥接铸件保留了物体,因此为防止泄漏,必须遵循相应的CFRelease
某处.SecItemCopyMatching
肯定不会为我们发布查询,所以如果我们使用保留桥,那么我们需要自己发布生成的Core Foundation对象.(我们在第4行做)SecItemCopyMatching
已创建其结果,保留计数为1,我们负责释放.(我们知道这是因为它的名字中有"复制".)__bridge_transfer
让ARC知道这个责任,所以它能够自动为我们做.NSMutableDictionary
; 那是错的.此外,它反对buildSearchQuery
返回一般的Cocoa样式约定NSMutableDictionary
.简单的NSDictionary
s在两种情况下都能正常工作.这里的经验法则是__bridge_retained
需要后跟a CFRelease
,而"复制"或"创建"函数的结果必须使用__bridge_transfer
.
归档时间: |
|
查看次数: |
9542 次 |
最近记录: |