两者区别
所在库 | Foundation | CoreFoundation |
---|---|---|
对象归属 | OC对象 | C对象 |
实现语言 | Objecitve-c | c语言 |
ARC内存管理 | ARC自动管理 | 手动管理 |
MRC内存管理 | 手动管理 | 手动管理 |
互相转换
MRC下:两者可以直接转换,均为手动内存管理
ARC下:可通过_bridge, _bridge_transfer, _bridage_retained关键字转换,区别如下:
关键字 | _bridge | _bridge_transfer | _bridge_retained |
---|---|---|---|
用途 | 双向转换 | CF - F | F - CF |
内存交接 | 维持现状 | 转换后由ARC自动管理 | 转换后手动管理 |
核心含义 | 不移交内存控制权 | 赋予ARC管理权 | 剥脱ARC管理权 |
(CF代指Core Foundation对象, F代指Foundation对象)
实战举例
以字符串为例:
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;
网友评论