Core Foundation对象与Objective - C对象桥接基本原理
- 类型兼容:Core Foundation框架(C语言框架)与Objective - C运行时环境之间存在一定的类型兼容关系。例如,
NSString
在Core Foundation中有对应的CFStringRef
类型。这种类型对应关系使得它们在一定程度上可以相互转换。
- 桥接函数:Objective - C提供了一系列的桥接函数,如
__bridge
、__bridge_transfer
和__bridge_retained
。这些函数用于在Core Foundation对象和Objective - C对象之间进行安全的转换。
__bridge
:仅进行类型转换,不改变对象的所有权。它告诉编译器这两个对象实际上指向同一块内存,但ARC不会对通过__bridge
转换的Core Foundation对象进行内存管理。例如:
CFStringRef cfString = CFStringCreateWithCString(kCFAllocatorDefault, "Hello", kCFStringEncodingUTF8);
NSString *nsString = (__bridge NSString *)cfString;
// 这里nsString和cfString指向同一块内存,但是ARC不管cfString的内存管理
- `__bridge_transfer`:将Core Foundation对象的所有权转移给ARC管理的Objective - C对象。当ARC管理的对象被释放时,与之桥接的Core Foundation对象也会被释放。例如:
CFStringRef cfString = CFStringCreateWithCString(kCFAllocatorDefault, "Hello", kCFStringEncodingUTF8);
NSString *nsString = (__bridge_transfer NSString *)cfString;
// 此时cfString的所有权转移给nsString,当nsString释放时,cfString也会被释放
- `__bridge_retained`:创建一个新的被Core Foundation retain的对象,并且这个对象可以被Core Foundation内存管理函数控制。同时,ARC也会管理返回的Objective - C对象。例如:
NSString *nsString = @"Hello";
CFStringRef cfString = (__bridge_retained CFStringRef)nsString;
// 这里CFStringRef对象被retain,当ARC释放nsString时,cfString不会被立即释放,需要手动CFRelease(cfString)
ARC环境下桥接对象的内存管理
- 使用
__bridge
:ARC不会管理通过__bridge
转换的Core Foundation对象。开发人员需要手动使用Core Foundation的内存管理函数(如CFRelease
)来释放Core Foundation对象。例如:
CFStringRef cfString = CFStringCreateWithCString(kCFAllocatorDefault, "Hello", kCFStringEncodingUTF8);
NSString *nsString = (__bridge NSString *)cfString;
// 使用完后手动释放cfString
CFRelease(cfString);
- 使用
__bridge_transfer
:ARC会管理通过__bridge_transfer
转换得到的Objective - C对象,同时也会负责释放与之桥接的Core Foundation对象。当ARC释放Objective - C对象时,对应的Core Foundation对象也会被释放。无需手动释放Core Foundation对象。
- 使用
__bridge_retained
:ARC会管理转换得到的Objective - C对象,但是对于通过__bridge_retained
得到的Core Foundation对象,开发人员需要手动调用Core Foundation的内存管理函数(如CFRelease
)来释放Core Foundation对象,即使Objective - C对象被ARC释放了,Core Foundation对象仍需要手动释放。