美文网首页
__bridge , __bridge_transfer, __

__bridge , __bridge_transfer, __

作者: 黑糊糊的梦想家 | 来源:发表于2019-08-19 22:10 被阅读0次

    __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进行手动释放
    

    相关文章

      网友评论

          本文标题:__bridge , __bridge_transfer, __

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