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也不用手動釋放。
__bridge
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章