ARC下带CF前缀的类型与OC类型转换

在对钥匙串操作时这个函数

OSStatus SecItemCopyMatching(CFDictionaryRef query, CFTypeRef * __nullable CF_RETURNS_RETAINED result)

经常用到,表示查询Keychain里是否有符合条件的记录。第一个参数查询条件,第二个查询到结果的引用。

在非ARC模式下的基本使用方法如下

NSData *passwordData = NULL;

if (SecItemCopyMatching((CFDictionaryRef)returnDictionary, (CFTypeRef *)&passwordData) == noErr){

//ToDo

}else{

//ToDo

}

这里需要把 &passwordData 转换为 CFTypeRef * 类型。而在ARC模式下 这样写会报错

Cast of an indirect pointer to an Objective-C pointer to 'CFTypeRef *' (aka 'const void **') is disallowed with ARC

要解决这个问题需要对ARC模式下CF类型与OC类型之间的转换有所了解,最常用的有两个转换关键字,(__bridge type)expression 和 (__bridge_transfer Objective-C type)expression。

(__bridge type)expression //type 为id 或者 void* , expression为带有CF前缀类型的变量或者 void* 变量。如下所示

1、id obj = [[NSObject alloc] init];

void *p = (__bridge void *)obj;

id o = (__bridge id)p;

2、CGImageRef cgimage

self.layer.contents = (__bridge id)cgimage;

(__bridge_transfer Objective-C type)expression //type为OC类型 expression 可以是带有CF前缀的类型变量 。

解决上面遇到的类型转换错误可以这样做

CFTypeRef passwordDataRef;

SecItemCopyMatching((CFDictionaryRef)returnDictionary,  &passwordDataRef)

.........

NSData *passwordData = (__bridge_transfer NSData*)passwordDataRef;

这样转换之后再对passwordData 进行处理就不会报错了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值