__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进行手动释放
网友评论