iOS之__bridge / __bridge_retained / __bridge_transfer
__bridge
, __bridge_retianed
和 __bridge_transfer
用来处理OC对象和CF对象的转换。
转换规则:
__bridge
:只转换对象类型,不涉及对象所有权的转换(不增加对象引用计数);容易造成悬垂指针。- 悬垂指针:指针指向的内存已经被释放;
- 野指针:没有被正确初始化的指针,指向内存中随机的位置;
__bridge_retained
:OC对象转换成CF对象,OC对象所有权交给CF对象(CF指针也会持有对象),CF对象需要自己管理内存。__bridge_transfer
:CF对象转换成OC对象,将CF对象所有权交给OC对象(CF指针不再持有对象),ARC自动管理内存。
ARC环境下编译器会自动管理OC对象的内存,但是不会自动管理CF对象的内存。
CF对象需要手动释放。
__bridge
示例:
1 | id obj = [[NSObject alloc] init]; |
__bridge_retained
示例:
1 | void *pointer = NULL; |
__bridge_transfer
示例:
1 | void *pointer = NULL; |