美文网首页
Toll-free bridging

Toll-free bridging

作者: 温柔的熊 | 来源:发表于2021-10-12 11:48 被阅读0次

字面意思是“免费桥接技术”,桥接的是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的內存会被系统自动管理,不需要再手动管理內寸。

相关文章

网友评论

      本文标题:Toll-free bridging

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