Toll-free bridging

字面意思是“免费桥接技术”,桥接的是Core Foundation框架和 Foundation框架之间的数据。

通过这种技术,可以将Core Foundation中的类,比如 CFLocale,转化为对应的Foundation中的类 NSLocale 来使用。

语法和强制类型转换一样,如下,是将 NSLocale类型转换成 CFLocalRef类型

NSLocale *gbNSLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"];
CFLocaleRef gbCFLocale = (__bridge CFLocaleRef)gbNSLocale;

内存管理的问题

在ARC的情况下,Foundation类的内存是自动管理的。
Core Foundation中的类需要手动管理。
在数据类型转换后,涉及到内存管理的问题,在以下几种修饰符下,分别有不同的处理。

修饰符有三种
__bridge
__bridge_retained
__bridge_transfer

逐一来说

__bridge

如果用__bridge来修饰的,只是将指针类型转移了,其内存管理的所有权不变。也就是说,创建时的类是ARC管理內存,转换后仍然是。创建时的类是Core Foundation类,需要手动管理内存,转换后仍然是。

NSLocale *gbNSLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"];
CFLocaleRef gbCFLocale = (__bridge CFLocaleRef)gbNSLocale;
// 这里的gbCFLocale不需要手动管理内存

CFLocaleRef myCFLocale = CFLocaleCopyCurrent();
NSLocale *myNSLocale = (__bridge NSLocale *)CFBridgingRelease(myCFLocale);
// 这里的mhNSLocale需要手动管理内存

__bridge_retained

在将object-c的指针转化为Core Foundation的指针时,用__bridge_retained修饰符,意味着自己要去管理内存。

NSLocale *gbNSLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"];
CFLocaleRef gbCFLocale = (__bridge_retained CFLocaleRef)gbNSLocale;
// 这里的gbCFLocale需要自己手动管理内存

而将Core Foundation指针转换为Object-c 不用这个修饰符

__bridge_transfer

这个修饰符和__bridge_retained有相反的作用,再将非Object-c的指针转化为Object-c的指针时,是用此修饰符,会把此对象的内存管理权限交给ARC去处理。这样,我们就不用再去自己管理该对象的内存问题了。

CFLocaleRef myCFLocale = CFLocaleCopyCurrent();
NSLocale *myNSLocale = (__bridge_transfer NSLocale *)CFBridgingRelease(myCFLocale);
// myNSLocale的內存会被系统自动管理,不需要再手动管理內寸。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容