https://developer.apple.com/library/ios/documentation/CoreFoundation/Conceptual/CFDesignConcepts/Articles/tollFreeBridgedTypes.html
toll-free bridge本质上即为Core Foundation框架和Cocoa Foundation框架中类型的相互转换,在一些含有toll-free类型参数的函数中,既可以用Core Foundation的类型也可以用Cocoa Foundation的类型
ps:
Core Foundation框架:一组C语言接口,例如CF开头的一些类, 如CFString
Cocoa Foundation框架:Objecitve-C接口,例如NS开头的一些类,如NSString
例(非ARC):
NSString *string = @"test string";
CFStringRef cfString = (CFStringRef)string;
以上代码在非ARC的情况下适用,若在ARC的情况下需要用一些关键字(_bridge, _bridge_retained, _bridge_transfer)转换,否则编译器会报错
_bridge:只做类型转换,对象所有权不变
_bridge_retained: Cocoa Foundation的对象向CF的对象转换,CF对象的内存需要自己释放(CFRelease)
_bridge_transfer: CF的对象向Cocoa Foundation的对象转换,Cocoa Foundation的对象内存由ARC托管
注:CF对象不会被ARC托管
例(ARC):
_bridge:
NSString *string = @"test string";
CFStringRef cfString = (_bridge CFStringRef)string;
...
CFRelease(cfString);
此时如果 string 对象被释放,那么cfString也会被释放
_bridge_retained:
NSString *string = @"test string";
CFStringRef cfString = (_bridge_retained CFStringRef)string;
...
CFRelease(cfString);
此时如果 string 对象被释放,cfString不会被释放, 因为_bridge_retained会将引用加一
_bridge_transfer:
CFStringRef cfString = CFStringCreate...()...;// 或者CFStringRef cfString = CFSTR("Hello, world."); //CFSTR创建的字符串不能被修改,不通过CFString释放,直到程序结束才会被释放
NSString *string = (_bridge_transfer NSString*)cfString;
此时string会被ARC托管,即使cfString被释放,string还依然会存在