指针铸造与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

上一篇: Pointer casting with ARC

下一篇: Type conversion of &self causes compiler error