美文网首页
brige转换

brige转换

作者: LeeDev | 来源:发表于2018-09-19 10:23 被阅读11次

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
    
    
}

相关文章

网友评论

      本文标题:brige转换

      本文链接:https://www.haomeiwen.com/subject/onbbnftx.html