zoukankan      html  css  js  c++  java
  • 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 进行处理就不会报错了。

  • 相关阅读:
    weblogic 扩展集群里受管节点
    docker搭建weblogic环境
    Docker 快速删除所有容器
    转载的mysql 相关
    mysql字符集修改步骤
    ORA-12705: Cannot access NLS data files or invalid environment
    Authentication for user weblogic denied
    ONS 禁用
    Java-并发-什么是CAS机制?
    862. 和至少为 K 的最短子数组-前缀和/数组/滑动窗口-困难
  • 原文地址:https://www.cnblogs.com/yuanxiaoping_21cn_com/p/6414946.html
Copyright © 2011-2022 走看看