兩者區(qū)別
| 所在庫 | Foundation | CoreFoundation |
|---|---|---|
| 對象歸屬 | OC對象 | C對象 |
| 實現(xiàn)語言 | Objecitve-c | c語言 |
| ARC內(nèi)存管理 | ARC自動管理 | 手動管理 |
| MRC內(nèi)存管理 | 手動管理 | 手動管理 |
互相轉(zhuǎn)換
MRC下:兩者可以直接轉(zhuǎn)換,均為手動內(nèi)存管理
ARC下:可通過_bridge, _bridge_transfer, _bridage_retained關(guān)鍵字轉(zhuǎn)換,區(qū)別如下:
| 關(guān)鍵字 | _bridge | _bridge_transfer | _bridge_retained |
|---|---|---|---|
| 用途 | 雙向轉(zhuǎn)換 | CF - F | F - CF |
| 內(nèi)存交接 | 維持現(xiàn)狀 | 轉(zhuǎn)換后由ARC自動管理 | 轉(zhuǎn)換后手動管理 |
| 核心含義 | 不移交內(nèi)存控制權(quán) | 賦予ARC管理權(quán) | 剝脫ARC管理權(quán) |
(CF代指Core Foundation對象, F代指Foundation對象)
實戰(zhàn)舉例
以字符串為例:
NSString對象 (Foundation對象)
CFStringRef (Core Foundation對象)
NSString 轉(zhuǎn) CFStringRef
1、 // _bridge方式 , 轉(zhuǎn)換后CFString仍由ARC自動管理內(nèi)存
NSString *fString = @"foundation";
CFStringRef CFString = (__bridge CFStringRef)fString);
2、// _bridge_retained方式,轉(zhuǎn)換后CFString需手動管理內(nèi)存
NSString *fString = @"foundation";
CFStringRef CFString = (__bridge_retained CFStringRef)fString);
CFStringRef 轉(zhuǎn) NSString
1、// _bridge方式 , 轉(zhuǎn)換后fString仍需手動管理內(nèi)存
CFStringRef CFString = CFStringCreateWithCString(NULL, "CF",kCFStringEncodingASCII);
NSString *fString = (__bridge NSString *)CFString;
2、// _bridge_transfer方式,轉(zhuǎn)換后fString由ARC自動管理內(nèi)存
CFStringRef CFString = CFStringCreateWithCString(NULL, "CF", kCFStringEncodingASCII);
NSString *fString = (__bridge_transfer NSString *)CFString;