多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > __bridge_retained/__bridge_transfer/__bridge使用詳解

__bridge_retained/__bridge_transfer/__bridge使用詳解

來源:程序員人生   發布時間:2014-12-12 08:33:08 閱讀次數:5167次
第1、__bridge_retained的使用
__bridge_retained轉換可以使要轉換的變量也持有所賦值的對象
 void *p=0;
        {
        id obj=[[NSObject alloc] init];
        p=(__bridge_retained void*)obj;
        }
        NSLog(@"class=%@",[(__bridge id)p class]);
 輸出結果:
class=NSObject
分析:

變量作用域結束后,雖然obj失效,__bridge_retained轉換使變量p看上去處于持有該對象的狀態,因此該對象不會被釋放


第2、__bridge_transfer
當想把本來具有對象所有權的變量,在類型轉換后,讓其釋放本來所有權的時候,需要使用 __bridge_transfer 關鍵字。
如在非ARC環境下:
id obj = (id)p;
[obj retain];
[(id)p release];
在ARC環境下,使用__bridge_transfer,以下所示:
id obj = (__bridge_transfer id)p;

__bridge_retained是編譯器為我們做了retain操作,__bridge_transfer是編譯器為我們做了release


第3、在 Core Foundation框架中的使用
CoreFoundation對象是用C語言實現CoreFoundation Framework的對象,也有援用計數的概念,使用的關鍵詞是CGRetain/CFRelease,
由于和Foundation結構相同,在非ARC下可以用C語言的類型轉換,以下所示:
NSString *str=@"RichardYang";
 CFStringRef strRef=(CFStringRef)str;
在ARC環境下,由于編譯器會管理Foundation對象的內存,但CoreFoundation對象卻不會處理,此時,使用關鍵詞__bridge/__bridge_retained進行處理。
1、使用__bridge_retained
 @autoreleasepool {
        CFMutableArrayRef cfObject=nil;
        {
            id obj=[[NSMutableArray alloc] init];
            cfObject=(__bridge_retained CFMutableArrayRef)obj;
            //CFShow(cfObject);
            printf("the retain count =%ld ",CFGetRetainCount(cfObject));
        }
        printf("the retain count is %ld ",CFGetRetainCount(cfObject));
        CFRelease(cfObject);//如果不履行CFRelease則內存泄漏
    }
    輸出結果為:
    the retain count =2
    the retain count is 1
2.使用__bridge
只做類型轉換,但是不修改對象(內存)管理權;
    @autoreleasepool {
        CFMutableArrayRef cfObject=nil;
        {
            id obj=[[NSMutableArray alloc] init];
            cfObject=(__bridge CFMutableArrayRef)obj;
            //CFShow(cfObject);
            printf("the retain count =%ld ",CFGetRetainCount(cfObject));
        }
        //printf("the retain count is %ld ",CFGetRetainCount(cfObject));
        CFRelease(cfObject);
    }
    CFRelease(cfObject);會拋異常,__bridge實現了轉換,并沒有保持對象。
3、使用__bridge_transfer
    @autoreleasepool {
        CFMutableArrayRef cfObject=CFArrayCreateMutable(kCFAllocatorDefault, 0, NULL);
        printf("the retaincount is %ld ",CFGetRetainCount(cfObject));
        
        /*
        * __bridge_transfer,對cfObject履行release操作,然后將對象賦給了obj,但是cfObject依然指向存在的對象,可以正常使用
         */
        id obj=(__bridge_transfer id)cfObject;
        printf("after __bridge_transfer retaincount is %ld ",CFGetRetainCount(cfObject));
        NSLog(@"class=%@",obj);
    }
    /*
     *obj跳出作用域,強援用失效,釋放對象,沒有內存泄漏
     */    
      return 0;





生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 极品色αv影院 | 国产精品亚洲第一区二区三区 | 久久精品亚洲99一区二区 | 欧美最猛黑人xxxx黑人猛交98 | 亚洲天堂v | 男女最猛烈xx00动态视频 | 欧美 日韩 亚洲 中文字幕 一区 | 国产清纯91天堂在线观看 | 久久久国产成人精品 | 国产视频一区在线观看 | 亚洲欧洲日产国码在线观看 | 欧美成人性视频播放 | 三级做爰大爽长视频在线观看 | 亚洲国产成人精品青青草原100 | 成人不卡在线 | 亚洲综合视频在线 | 偷自拍第一页 | a级网站| 亚洲欧洲精品久久 | 欧美大陆日韩一区二区三区 | 久爱免费观看在线网站 | 国产亚洲精品一区二区 | 黄大色黄美女精品大毛片 | 色综合天天综合网亚洲 | 欧美一级日韩一级 | 清纯唯美亚洲综合五月天 | 国产精品成人一区二区1 | 一区二区三区在线看 | 337p日本欧洲亚洲大胆艺术图666 | 性久久久久 | 222aaa免费| 亚洲国产精品综合久久20 | 另类小说综合 | 亚洲精品中文字幕乱码三区 | 日本xxxⅹ色视频在线观看网站 | 五月天婷婷在线视频国产在线 | 欧美人xxx| 国产欧美日韩亚洲精品区2345 | 高级毛片 | 亚洲一区二区视频 | 波多野结衣免费一区二区三区香蕉 |