zoukankan      html  css  js  c++  java
  • __bridge 使用注意

    前奏

    在平常开发中,我们可能遇到 CoreFoundation(CF) 框架的对象和 OC 对象之间的类型转换,这时候我们需要 __bridge 来帮忙
    注意 : 如果是使用 CF

    __bridge

    • CF -> OC (只完成类型转换)
    - (void)bridgeCF2OC{
        CFStringRef aCFString = CFStringCreateWithCString(NULL, "bridge", kCFStringEncodingASCII);
        self.myString = (__bridge NSString *)(aCFString);
    
        (void)aCFString;
    
        NSLog(@"bridge--%@",self.myString);
        /*
            __bridge 关键字只负责 CF 到 OC 之间的对象类型转换,并没有把内存管理的权限交给 ARC,因此不管 ARC 还是 MRC 我们都需要管理 CF 对象的内存
         */
        CFRelease(aCFString);
    }
    • OC -> CF (只完成类型转换)
        NSString *aString = [NSString stringWithFormat:@"test"];
        CFStringRef cString = (__bridge CFStringRef)(aString);
        /*
            现在 String 的生命在 OC 手上,CF无法干预内存管理
         */
        // CFRelease(cString);
        NSLog(@"%@",cString);

    __bridge_transfer 或者 CFBridgingRelease()

    • CF -> OC (完成类型转换的同时,赋予了ARC管理内存的权限,CF还是有权限的)
    • NSString *aNSString = [[NSString alloc]initWithFormat:@"test"];
        CFStringRef aCFString = (__bridge_retained CFStringRef) aNSString;
        // 赋予ARC 管理内存的权利
        aNSString = (__bridge_transfer NSString *)aCFString;
        aNSString = nil;
        // 这里已经把权限交给了 ARC 了,如果ARC已经释放了内存,那么CF对象还是无法读取内存
        // NSLog(@"%@",aCFString);
        // CFRelease(aCFString);
        // NSLog(@"%@",aNSString);

    __bridge_retained 或者 CFBridgingRetain()

    • OC -> CF (完成类型转换的同时,剥夺了ARC管理内存的权限,CF还是有权限的)
    NSString *aString = [NSString stringWithFormat:@"test"];
        // 这时候对象的生命 周期管理责任交给 CF 了
        CFStringRef cString = (__bridge_retained CFStringRef)(aString);
        // 原对象的内存并不会因此而销毁
        aString = nil;
        NSLog(@"%@",cString);
        // 正确的释放方法 :
        CFRelease(cString);




    转自:http://www.jianshu.com/p/1cc4bf898bf1

  • 相关阅读:
    ES6新特性
    CSS + HTML 鼠标在图片上悬停时的显示文字,移走时文字消失
    APICloud closeToWin和closeWin的使用
    基于vue-cli配置移动端自适应
    Cookies,localStorage,sessionStorage,Web SQL Database(客户端)会话存储学习
    select标签默认选择选项
    MySQL数据库的配置
    jsp定义 ,JSON对象
    eclipse配置
    VS2017 C++编译时出现 "the windows sdk version for 8.1 was not found"解决办法(亲测有效)
  • 原文地址:https://www.cnblogs.com/huangzs/p/7492818.html
Copyright © 2011-2022 走看看