oc 的id 类型 和 C 的相互转换,主要涉及到
普通桥接转换
和携带所有权的转换
主要__bridge
: 普通桥接
__bridge_retained
: C类型持有对象, 等价于CFBridgingRetain(obj)
__bridge_transfer
: C 类型释放对象, 等价CFBridgingRelease(p)
1. Id => C
- (void)brigeTest1 {
void * p = 0;
{
id obj = [NSObject new];
// p = (__bridge_retained void *)obj; //打印p = <NSObject: 0x60c00001e3f0>
p = (void *) CFBridgingRetain(obj); // 和 (__bridge_retained void *)obj 是一样的
// p = (__bridge void *)obj; // 直接崩溃,因为p 不持有 obj 对象, 当 {} 结束的时候,obj被释放了, 所以导致崩溃
// p = (__bridge_transfer void *)obj; //报错,就是 id类型的 不能 通过 __bridge_transfer 转换
}
NSLog(@" p = %@",p);
CFBridgingRelease(p); //因为 前面有retain 操作,所以 要指向 release操作
}
2. C => Id
- (void)brigeTest2 {
id obj = [NSObject new];
void * p = (void *)CFBridgingRetain(obj);
// id obj2 = (__bridge id)p;
// CFBridgingRelease(p);
// 等价于
// id obj2 = CFBridgingRelease(p);
// 等价于 __bridge_transfer 相当于 释放 C 的引用计数
id obj2 = (__bridge_transfer id)p;
NSLog(@"obj2 = %@,obj == obj2:%@",obj2,@(obj == obj2));//obj2 = <NSObject: 0x60000001dab0>,obj == obj2:1
}
网友评论