brige转换

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 = 
        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 = ,obj == obj2:1
    
    
}

你可能感兴趣的:(brige转换)