
目录
一,基本概念
二,内存管理
三,互相转换
四,简便方法
一,基本概念
1,Foundation:OC类库,NS开头
NSString,NSArray,NSDictionary...
2,CoreFoundation:C类库,CF开头
CFString,CFArray,CFDictionary...
二,内存管理
1,Foundation
-
MRC环境下由程序员手动管理,创建的对象需要手动调用release进行释放 -
ARC环境下由系统自动管理,创建的对象系统会自动调用release进行释放
2,CoreFoundation
- 任何环境下都由程序员手动管理,只要使用名称包含
create/new/retain/copy的函数创建出来的,都需要手动调用release进行释放
三,互相转换
1,转换前后是同一个对象,只需要释放一次
// OC -> C
NSString *ocStr1 = [NSString stringWithFormat:@"123"];
CFStringRef cStr1 = (__bridge CFStringRef)ocStr1;
NSLog(@"%p---%p", ocStr1, cStr1);
// C -> OC
CFStringRef cStr2 = CFStringCreateWithCString(CFAllocatorGetDefault(), "456", kCFStringEncodingASCII);
NSString *ocStr2 = (__bridge NSString *)cStr2;
NSLog(@"%p---%p", cStr2, ocStr2);
CFRelease(cStr2);
// 打印
0xff6a5d565a54bce8---0xff6a5d565a54bce8
0xff6a5d565a04ccb8---0xff6a5d565a04ccb8
2,MRC:强制转换
// OC -> C
NSString *ocStr1 = [NSString stringWithFormat:@"123"];
CFStringRef cStr1 = (CFStringRef)ocStr1;
// C -> OC
CFStringRef cStr2 = CFStringCreateWithCString(CFAllocatorGetDefault(), "456", kCFStringEncodingASCII);
NSString *ocStr2 = (NSString *)cStr2;
CFRelease(cStr2);
3,ARC
- 对象内存管理权不转移:
__bridge
// OC -> C:内存管理权仍然在ocStr1(Foundation)这边
NSString *ocStr1 = [NSString stringWithFormat:@"123"];
CFStringRef cStr1 = (__bridge CFStringRef)ocStr1;
// C -> OC:内存管理权仍然在cStr2(CoreFoundation)这边
CFStringRef cStr2 = CFStringCreateWithCString(CFAllocatorGetDefault(), "456", kCFStringEncodingASCII);
NSString *ocStr2 = (__bridge NSString *)cStr2;
CFRelease(cStr2);
- 对象内存管理权转移:
__bridge_retained,__bridge_transfer
// OC -> C:内存管理权从ocStr1(Foundation)转移到cStr1(CoreFoundation)
NSString *ocStr1 = [NSString stringWithFormat:@"123"];
CFStringRef cStr1 = (__bridge_retained CFStringRef)ocStr1;
CFRelease(cStr1);
// C -> OC:内存管理权从cStr2(CoreFoundation)转移到ocStr2(Foundation)
CFStringRef cStr2 = CFStringCreateWithCString(CFAllocatorGetDefault(), "456", kCFStringEncodingASCII);
NSString *ocStr2 = (__bridge_transfer NSString *)cStr2;
四,简便方法
1,CFBridgingRetain = __bridge_retained
从名称中可以看出cStr1是retain得来的,所以需要调用release
NSString *ocStr1 = [NSString stringWithFormat:@"123"];
//CFStringRef cStr1 = (__bridge_retained CFStringRef)ocStr1;
CFStringRef cStr1 = CFBridgingRetain(ocStr1);
CFRelease(cStr1);
2,CFBridgingRelease = __bridge_transfer
从名称中可以看出cStr2已经release,所以无需再调用release
CFStringRef cStr2 = CFStringCreateWithCString(CFAllocatorGetDefault(), "456", kCFStringEncodingASCII);
//NSString *ocStr2 = (__bridge_transfer NSString *)cStr2;
NSString *ocStr2 = CFBridgingRelease(cStr2);