主要涉及以下三種用法:
- __bridge
- __bridge_retained
- __bridge_transfer
__bridge
- (void)test
{
NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"]; // url retained
CFURLRef ref = (__bridge CFURLRef)url; // No CFRetain, No CFRelease
// url released
}
__bridge_retained
將 OC 對象轉(zhuǎn)化為 CF 對象時挪捕,將 OC 對象的所有權(quán)交給 CF 對象府怯,相當(dāng)于 CFBridgingRetain()
泄露:
- (void)test2
{
NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"]; // url retained
CFURLRef ref = (__bridge_retained CFURLRef)url; // ref CFRetained
// url released
}
不泄露:
- (void)test2
{
NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"]; // url retained
CFURLRef ref = (__bridge_retained CFURLRef)url; // ref CFRetained
CFRelease(ref); // ref CFReleased;如果這里不 CFRelease螺男,就會有內(nèi)存泄露
// url released
}
__bridge_transfer
將 CF 對象轉(zhuǎn)化為 OC 對象時卤材,將 CF 對象的所有權(quán)交給 OC 對象,相當(dāng)于 CFBridgingRelease()
泄露:
- (void)test3
{
CFStringRef cfString = CFStringCreateWithFormat(NULL, NULL, CFSTR("Hello, world!")); // cfString alloced
}
不泄露:
- (void)test3
{
CFStringRef cfString = CFStringCreateWithFormat(NULL, NULL, CFSTR("Hello, world!")); // cfString alloced
CFRelease(cfString); // cfString CFReleased
}
不泄露:
- (void)test3
{
CFStringRef cfString = CFStringCreateWithFormat(NULL, NULL, CFSTR("Hello, world!")); // cfString alloced
// CFRelease(cfString); // cfString CFReleased
NSString *osString = (__bridge_transfer NSString *)cfString; // cfString CFReleased, osString retained
// osString released
}
總結(jié)
- 每一個 CFRetain 都需要一個 CFRelease 對應(yīng);
- 每一個 CFCreate 都需要一個 CFRelease 對應(yīng)毫蚓;
- __bridge_retained 等價(jià)于 CFRetain;
- __bridge_transfer 等價(jià)于 CFRelease昔善;