指针铸造与ARC
ARC在下面的表演中给了我很大的困难:
NSDictionary *attributes;
SecItemCopyMatching((__bridge CFDictionaryRef)keychainItemQuery, (CFTypeRef *)&attributes);
错误:对于指向'CFTypeRef'(又名'const void *')的Objective-C指针的间接指针的转换不允许使用ARC
问题是属性不应该是一个字典,它应该是一个SecKeyRef或CFDataRef。 然后将其转换回NSData以获取复制到其中的密码数据。
像这样:
CFDataRef attributes;
SecItemCopyMatching((__bridge CFDictionaryRef)keychainItemQuery, (CFTypeRef *)&attributes);
NSData *passDat = (__bridge_transfer NSData *)attributes;
当我们正在做类似的事情并使用上面的例子时,我们遇到了另一个问题:
CFDataRef resultRef;
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)searchDictionary,
(CFTypeRef *)&resultRef);
NSData* result = (__bridge_transfer NSData*)resultRef;
这将导致EXEC_BAD_ACCESS,因为resultRef未设置为任何地址并指向内存。
CFDataRef resultRef = nil;
这将修复错误。
需要将attributes
更改为&attributes
CFDataRef attributes;
SecItemCopyMatching((__bridge CFDictionaryRef) keychainItemQuery, ( CFTypeRef*) &attributes);
NSData* passDat=(__bridge_transfer NSData*) attributes;
链接地址: http://www.djcxy.com/p/44905.html