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