什么时候用到__bridge关键字

在ARC模式中,如果需要进行Core Foundation与Objective-C类型之间的转换。需要用到__bridge桥接。

1
2
3
4
5
id obj = [[NSObject alloc] init];

void *p = (__bridge void *)obj;

id o = (__bridge id)p;

将Objective-C的对象类型用 __bridge 转换为 void* 类型和使用 __unsafe_unretained 关键字修饰的变量是一样的。

__bridge_retained 从 Objective-C -> Core Foundation

1
2
3
id obj = [[NSObject alloc] init];

void *p = (__bridge_retained void *)obj;

相当于下面的实现

1
2
3
id obj = [[NSObject alloc] init];
void *p = obj;
[(id)p retain];

所以用完了这个对象后,需要CFRelease一下对象

__bridge_transfer 从 Core Foundation -> Objective-C

1
id obj = (__bridge_transfer )p;

相当于

1
2
3
id obj = (id)p;
[obj retain];
[(id)p release];

ARC会管理内存