1. __bridge 源在哪端,哪端消除
(__bridge T) op:告訴編譯器在 bridge 的時候不要多做任何事情
// objc to cf
NSString *nsStr = [self createSomeNSString];
CFStringRef cfStr = (__bridge CFStringRef)nsStr;
CFUseCFString(cfStr);
// CFRelease(cfStr); 不需要
//源在Objc端 編譯器消除
// cf to objc
CFStringRef hello = CFStringCreateWithCString(kCFAllocatorDefault, "hello", kCFStringEncodingUTF8);
NSString *world = (__bridge NSString *)(hello);
CFRelease(hello); // 需要
[self useNSString:world];
//源在CF端 猿消除
2. __bridge_retained 兩端都要消除
(__bridge_retained T) op:( ObjC 轉(zhuǎn) CF 的時候使用)告訴編譯器在 bridge 的時候 retain 對象乏悄,開發(fā)者需要在CF一端負責釋放對象
// objc to cf
NSString *nsStr = [self createSomeNSString];
CFStringRef cfStr = (__bridge_retained CFStringRef)nsStr;
CFUseCFString(cfStr);
CFRelease(cfStr); // 需要
//源在Objc端 Objc端編譯器消除+CF端猿消除
3. __bridge_transfer Objc端消除
(__bridge_transfer T) op:( CF 轉(zhuǎn) ObjC 的時候使用)告訴編譯器轉(zhuǎn)移 CF 對象的所有權(quán)懈万,開發(fā)者不再需要在CF一端負責釋放對象
// cf to objc
CFStringRef hello = CFStringCreateWithCString(kCFAllocatorDefault, "hello", kCFStringEncodingUTF8);
NSString *world = (__bridge_transfer NSString *)(hello);
// CFRelease(hello); 不需要
[self useNSString:world];
//源在CF端 Objc端編譯器消除+CF端不必消除
文章參考:
Toll-Free Bridging