__bridge桥接的使用

一共有三种桥接方法:(在括号里敲__bridge方法才能有提示)
(__bridge <#type#>)<#expression#>)
(__bridge_retained <#CF type#>)<#expression#>)
(__bridge_transfer <#Objective-C type#>)<#expression#>)

main.m文件

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        B *b = [[B alloc] init] ;
        
        //1.__bridge桥接 , Foundation --> Core Foundation:
        NSString *str0 = @"小苹果" ;
        CFStringRef str1 = (__bridge CFStringRef)str0 ;
        
        //2.__bridge桥接 , Core Foundation --> Foundation:
        //明确告知我这个字符串到底是由谁来管理 , 当我用__bridge的时候我明确告知的是由创年者来管理 , 所以这里的str3没有占ARC的便宜,还是需要靠str2的生命周期来存活 , 这里我必须要调用str2的release方法 , 只不过在 Core Foundation 中不是realse 而是 CFRelease :
        CFStringRef str2 = CFStringCreateWithCString(NULL, "小苹果", kCFStringEncodingUTF8) ;
        NSString *str3 = (__bridge NSString *)(str2) ;
        CFRelease(str2) ;
        
        //3.如果我想占ARC的便宜直接让系统自动管理 , 我Core Foundation创建的对象我也不管理它了的话 , 我就不用用__bridge了~而应该使用 __bridge_transfer:
        CFStringRef str2 = CFStringCreateWithCString(NULL, "小苹果", kCFStringEncodingUTF8) ;
        NSString *str3 = (__bridge_transfer NSString *)(str2) ;
        //就不用调用 CFRelease(str2) ;
        
        //4.如果不想占ARC的便宜 , 就跨Core Foundation和Foundation使用的时候想全用Core Foundation来管理,需要我CFRelease的话那么用 __bridge_retained 桥接方法:
        NSString *str4 = @"小苹果" ;
        CFStringRef str5 = (__bridge_retained CFStringRef)str4 ;
        //在foundation中创建了一个str4 , 想在core foundation中去管理 , 那么我还要调用CFRelease方法:
        CFRelease(str5) ;     
    }
    return 0;
}

愿编程让这个世界更美好

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容