美文网首页
staic和bridge

staic和bridge

作者: 轰炸机上调鸡尾酒 | 来源:发表于2017-12-06 17:01 被阅读7次

    1.static全局变量与普通的全局变量有什么区别?:
    static全局变量只初使化一次,防止在其他源文件中被引用;  
     
    2.static局部变量和普通局部变量有什么区别?
    static局部变量只被初始化一次,下一次依据上一次结果值;
      
    3.static函数与普通函数有什么区别?
    static函数在内存中只有一份,普通函数在每个被调用中都维持一份拷贝

    4.__bridge、__bridge_transfer、__bridge_retained三者之间的区别。
    __bridge:,ARC下编译器不允许你隐式的将Object-C 指针转换成C指针,被代入对象的所有者需要明确对象生命周期的管理,不要出现异常访问的问题。

    id obj = [[NSObject alloc] init];
    void *p = (__bridge void *)obj;
    

    __bridge_retained: 将Objective-C对象转换为Core Foundation对象,把对象所有权桥接给Core Foundation对象,同时剥夺ARC的管理权。告诉ARC 一旦__bridge_retained转换完成,ARC就不用在负责释放该对象了,使用者需要手动释放,即使用者拥有该对象的持有权。

    d obj = [[NSObject alloc] init];
    void *p = (__bridge_retained void *)obj;
    
    非ARC下等价于
    
    id obj = [[NSObject alloc] init];
    void *p = obj;
    [(id)p retain];
    
    

    __bridge_transfer:非Objective-C对象转换为Objective-C对象,同时将对象的管理权交给ARC,开发者无需手动管理内存。在类型转换后,让其释放原先所有权的时候,需要使用 __bridge_transfer 关键字,告诉ARC 一旦__bridge_transfer转换完成,ARC要负责释放该对象!

        NSString *aNSString = [[NSString alloc]initWithFormat:@"test"];  
        CFStringRef aCFString = (__bridge_retained CFStringRef) aNSString;  
        aNSString = (__bridge_transfer NSString *)aCFString;
        可以看出来 __bridge_retained 是替我们做了 retain。剥夺ARC的管理权
        可以看出来 __bridge_transfer 是替我们做了 release。ARC获得管理权
    

    Toll-Free bridged
    在iOS世界,主要有两种对象:Objective-C 对象和 Core Foundation 对象0。Core Foundation 对象主要是有C语言实现的 Core Foundation Framework 的对象,其中也有对象引用计数的概念,只是不是 Cocoa Framework::Foundation Framework 的 retain/release,而是自身的 CFRetain/CFRelease 接口。

    这两种对象间可以互相转换和操作,不使用ARC的时候,单纯的用C原因的类型转换,不需要消耗CPU的资源,所以叫做 Toll-Free bridged。比如 NSArray和CFArrayRef, NSString和CFStringRef,他们虽然属于不同的 Framework,但是具有相同的对象结构,所以可以用标准C的类型转换。
    http://blog.csdn.net/yiyaaixuexi/article/details/8553659
    https://www.cnblogs.com/xinye/p/3168601.html

    相关文章

      网友评论

          本文标题:staic和bridge

          本文链接:https://www.haomeiwen.com/subject/wqbkixtx.html