Foundation与CoreFoundation
2019-04-04 本文已影响1人
码小菜
目录
一,基本概念
二,内存管理
三,互相转换
四,宏定义
一,基本概念
1,Foundation:OC类库,NS
开头
NSString,NSArray,NSDictionary...
2,CoreFoundation:C类库,CF
开头
CFString,CFArray,CFDictionary...
二,内存管理
1,Foundation:OC对象,MRC环境下由程序员手动管理,ARC环境下由系统自动管理
2,CoreFoundation:非对象,MRC和ARC环境下都由程序员手动管理,只要是使用名称包含create/new/copy/retain
的函数创建出来的,最后都需要手动调用release
进行释放
三,互相转换
- MRC:强制转换
// OC -> C
NSString *ocStr1 = [NSString stringWithFormat:@"123"];
CFStringRef cStr1 = (CFStringRef)ocStr1;
[ocStr1 release];
CFRelease(cStr1);
// C -> OC
CFStringRef cStr2 = CFStringCreateWithCString(CFAllocatorGetDefault(), "123", kCFStringEncodingASCII);
NSString *ocStr2 = (NSString *)cStr2;
CFRelease(cStr2);
[ocStr2 release];
- ARC
1,对象内存管理权不转移:__bridge
// OC -> C:仍然是自动管理
NSString *ocStr1 = [NSString stringWithFormat:@"123"];
CFStringRef cStr1 = (__bridge CFStringRef)ocStr1;
// C -> OC:仍然是手动管理
CFStringRef cStr2 = CFStringCreateWithCString(CFAllocatorGetDefault(), "123", kCFStringEncodingASCII);
NSString *ocStr2 = (__bridge NSString *)cStr2;
CFRelease(cStr2);
2,对象内存管理权转移:__bridge_retained
,__bridge_transfer
// OC -> C:转为手动管理
NSString *ocStr1 = [NSString stringWithFormat:@"123"];
CFStringRef cStr1 = (__bridge_retained CFStringRef)ocStr1;
CFRelease(cStr1);
// C -> OC:转为自动管理
CFStringRef cStr2 = CFStringCreateWithCString(CFAllocatorGetDefault(), "123", kCFStringEncodingASCII);
NSString *ocStr2 = (__bridge_transfer NSString *)cStr2;
四,宏定义
1,CFBridgingRetain
// 等价
CFStringRef cStr = (__bridge_retained CFStringRef)ocStr;
CFStringRef cStr = CFBridgingRetain(ocStr);
2,CFBridgingRelease
// 等价
NSString *ocStr = (__bridge_transfer NSString *)cStr;
NSString *ocStr = CFBridgingRelease(cStr);