__bridge

Core Foundation框架 (CoreFoundation.framework) 是一組C語言接口,基本是以CF開頭的
Foundation框架 是Object-c對象風格,其實本質內容是差不多的,除了前綴是NS和CF的區別,
對比圖片可見“最下面”


在非ARC環境下,Core Foundation框架和Foundation框架裏面的對象基本都可以直接強制轉換,如下:
NSString *stringObj = [[NSString alloc] init];
    CFStringRef stringRef = (CFStringRef)stringObj;
    NSString *stringObj1 = (NSString *)stringRef;

在arc環境下,如此轉換是不行的。
arc的內存是自動釋放的,但是arc值負責Foundation框架對象的自動釋放,而CoreFoundation.framework裏面的內存不歸arc管理,需要自己去釋放

所以在ARC環境裏面,這兩個框架對象的轉換就涉及到了內存管理責任的轉移。

根據不同需求,有3種轉換方式
•__bridge                                            (不改變對象所有權)
•__bridge_retained 或者 CFBridgingRetain()           (解除 ARC 所有權)
•__bridge_transfer 或者 CFBridgingRelease()          (給予 ARC 所有權)

1.__bridge 只是負責兩者形式的轉換,不涉及內存權限的轉移
2.
__bridge_retained

    NSString *stringObj = [[NSString alloc] init];
    CFStringRef stringRef = (__bridge_retained CFStringRef)stringObj;
********* 你的代碼處理過程 *******
    CFRelease(stringRef);
//這裏的StringRef的內存不歸ARC管理,所以需要你自己在後面釋放。

3.
__bridge_transfer

    CFStringRef aCFString = CFStringCreateWithCString(NULL, "test", kCFStringEncodingASCII);
    NSString *aNSString = (__bridge NSString *)aCFString;
這裏的
aCFString的內存管理責任已經被轉移給aNSString了,所以aCFString不用釋放,內存的管理轉交給aNSString了,而ARC環境下的NSString對象的內存由ARC釋放,所以這裏的aNSString也不用手動釋放。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章