zoukankan      html  css  js  c++  java
  • iOS中的自由桥接

    摘抄自《iOS 6编程实战》】

      与Objective-C库不同,我们在Objective-C中使用标准C语言和Core Foundation类库(CF*方法)不会遵循那些命名约定。这意味着ARC编译器无法百分百地释放不需要的内存。在ARC出现之前,我们可以将CF* 对象强制转换成NS*对象,这称为自由桥接(toll-free bridging)。也就是说,我们可以将CFString*通过类型转换变成NSString*类型。而有了ARC,我们便无法再这么做了,至少不指定 一个所有权转移修饰符时确实如此。

      ARC允许使用以下这些所有权转移修饰符:__bridge、__bridge_retained、__bridge_transfer

    1、__bridge

      第一个修饰符__bridge是一个普通的转换,它告诉ARC不要增加它的引用计数的值,也不要更改所有权。LLVM的设计师并没有让 __bridge成为默认所有权转移修饰符,因为做这样的决定过于大胆了。Core Foundation方法没有一个合适的命名约定,所以在没有明确指定一个所有权转移修饰符的情况下,编译器对于如何转移一个C指针类型的所有权无法错处 有把握的决定。

    2、__bridge_retained

      若想要转换C指针类型并增加引用计数的值,我们可以使用第二个修饰符。当要从Objective-C方法(它创建一个Core Foundation对象并在之后使用CFRelease方法将其释放)返回一个保留过的指针时,我们可以使用这个修饰符。如果Objective-C方 法属于NSRETURNS_RETAINED系列,就要返回保留过的指针。

    3、__bridge_transfer

      如果要将Core Foundation指针类型转换成Objective-C指针并为引用计数加1,可以使用最后一个修饰符。若Core Foundation方法创建一个对象,并且想要靠ARC来管理对象的内存,我们便可以使用这个修饰符。本质上,我们是“转移”了所有权给ARC。

     
     
     //NSString *str = @"123"; // Foundation
    //CFStringRef str2 = (__bridge CFStringRef)str; // Core Foundation
    //NSString *str3 = (__bridge NSString *)str2;

    //    CFArrayRef ---- NSArray
    //    CFDictionaryRef ---- NSDictionary
    //    CFNumberRef ---- NSNumber

    // Core Foundation中手动创建的数据类型,都需要手动释放
    //    CFArrayRef array = CFArrayCreate(NULL, NULL, 10, NULL);
    //    CFRelease(array);
    //
    //
    //    CGPathRef path = CGPathCreateMutable();
    //    CGPathRetain(path);
    //
    //    CGPathRelease(path);
    //    CGPathRelease(path);
    /**
     凡是函数名中带有createcopy ew etain等字眼, 都应该在不需要使用这个数据的时候进行release
     GCD的数据类型在ARC环境下不需要再做release
     CF(Core Foundation)的数据类型在ARCMRC环境下都需要再做release
     */
     
  • 相关阅读:
    Hadoop实战课程
    R语言实战读书笔记(七)基本统计分析
    R语言实战读书笔记(六)基本图形
    python-unexpected content storage modification出错
    python——no module named XX
    R语言实战读书笔记(五)高级数据管理
    R语言缺失值信息处理
    R语言,NA,NAN
    R语言实战读书笔记(四)基本数据管理
    R语言实战读书笔记(三)图形初阶
  • 原文地址:https://www.cnblogs.com/zhongxuan/p/4810321.html
Copyright © 2011-2022 走看看