__bridge , __bridge_transfer, __bridge_retained 的使用

__bridge , __bridge_transfer, __bridge_retained用于Foundation对象(oc对象)与Core Foundation对象(c对象)之间的相互转换

在ARC模式下,Foundation对象由系统自动释放;Core Foundation 对象不在ARC管理范围内,需要手动释放

__bridge:不改变对象的管理权所有者,本来由ARC管理的 Foundation 对象,转换成 Core Foundation 对象后依然由ARC管理;本来由开发者手动管理的 Core Foundation 对象转换成 Foundation 对象后继续由开发者手动管理。

NSString *str1 = @"111";
CFStringRef cfStr1 = (__bridge CFStringRef)str1;  //此处不用担心内存释放问题,由str1在ARC模式下自动释放

CFStringRef cfStr2 = CFStringCreateWithCString(NULL, "222", kCFStringEncodingUTF8);
NSString *str2 = (__bridge NSString *)cfStr2;
CFRelease(cfStr2);  //此处需要对cfStr2进行手动释放

__bridge_transfer:用在将 Core Foundation 对象转换成 Foundation对象时,用户进行内存管理权的移交。本来由开发者自行管理释放的 Core Foundation 对象 在转换Foundation对象后,交由 ARC来管理对象的释放。

 CFStringRef cfStr3 = CFStringCreateWithCString(NULL, "333", kCFStringEncodingUTF8);
 NSString *str3 = (__bridge_transfer NSString *)cfStr3;//此处不用担心内存释放问题,交由str3释放

__bridge_retained 用在将 Foundation对象转换成 Core Foundation 对象时,进行ARC内存管理权的剥夺,即本来由ARC管理的 Foundation对象在转换成 Core Foundation对象后,ARC不再继续管理该对象了,需要开发者手动释放该对象,否则会发生内存泄漏。

 NSString *str4 = @"444";
CFStringRef cfStr4 = (__bridge_retained CFStringRef)str4;
CFRelease(cfStr4);//此处需要对cfStr4进行手动释放
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容