__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实现了转换,并没有保持对象。
参考这篇文章。