__bridge、__bridge_transfer和__bridge_retained的区别

__bridge_retained(可以使要转换的变量也持有所赋值的对象)

 void *p=0;
        {
        id obj=[[NSObject alloc] init];
        p=(__bridge_retained void*)obj;
        }
        NSLog(@"class=%@",[(__bridge id)p class]);
 输出结果:
class=NSObject
分析:

变量作用域结束后,虽然obj失效,__bridge_retained转换使变量p看上去处于持有该对象的状态,因此该对象不会被释放。

 

__bridge_transfer(当想把本来具有对象所有权的变量,在类型转换后,让其释放本来所有权的时候,需要使用 __bridge_transfer 关键字。)
如在非ARC环境下:
id obj = (id)p;
[obj retain];
[(id)p release];
在ARC环境下,使用__bridge_transfer,以下所示:
id obj = (__bridge_transfer id)p;

__bridge_retained是编译器为我们做了retain操作,__bridge_transfer是编译器为我们做了release。

 

__bridge(只做类型转换,但是不修改对象(内存)管理权)

    @autoreleasepool {
        CFMutableArrayRef cfObject=nil;
        {
            id obj=[[NSMutableArray alloc] init];
            cfObject=(__bridge CFMutableArrayRef)obj;
            //CFShow(cfObject);
            printf("the retain count =%ld ",CFGetRetainCount(cfObject));
        }
        //printf("the retain count is %ld ",CFGetRetainCount(cfObject));
        CFRelease(cfObject);
    }
    CFRelease(cfObject);会抛异常,__bridge实现了转换,并没有保持对象。

 

参考这篇文章

 

posted @ 2020-03-24 16:31  zbblogs  阅读(407)  评论(0编辑  收藏  举报