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










网友评论