使用无缝桥接技术可以在定义于foundation框架的ob类和定义于core foundation框架中的c数据结构之间转换。
__bridge
NSArray * arry = @[@"1",@"",@"2",@"3",@"4"];
CFArrayRef acfArry = (__bridge CFArrayRef)arry;
//用以将 CF 对象转换为 OC 对象,或者 OC 对象转换为 CF 对象,但是不会对对象的 Retain Count、所有权产生任何影响。
__bridge 可以理解为:只是为了让编译通过,其他毫无影响。
__bridge_retain
//把一个oc对象转换为CF数据结构,ARC交出对象的保有所有权,CF结构指针,ARC有所有权CF也有所有权,引用技术为2,使用玩数据之后要调用CFRelease清理,剩下的1个计数生命周期结束清理。
__bridge_transfer
//把一个CF对象转换为OC对象,并且令ARC获得对象所有权,CF本身对指针的引用被释放,CF对象引用计数为1,那么就可以使用这种转换方式。
至于为什么要用到corefoundition的内容是因为两种库有自己独特的功能。
例子:比如在使用founditon的字典的时候会遇到一个大问题,其键的语义为拷贝,值的语义为保留,除非使用强大的无缝桥接技术,否则无法改变其语义。假如我们使用的键不支持拷贝操作,也就是不支持NSCopying协议,那么就会导致崩溃。
const void * retaincallbak(CFAllocatorRef allocator,const void * value) {
returnCFRetain(value);
}
void releasecallbak(CFAllocatorRef allocator,const void * value) {
returnCFRelease(value);
}
CFDictionaryKeyCallBacks keyallbacks = {0,retaincallbak,releasecallbak,NULL,CFEqual,CFHash};
CFDictionaryValueCallBacks valueallbacks = {0,retaincallbak,releasecallbak,NULL,NULL,CFEqual};
- (IBAction)bridgeAction:(id)sender {
CFMutableDictionaryRef acfdic =CFDictionaryCreateMutable(NULL,0, &keyallbacks, &valueallbacks);
NSMutableDictionary * adicc = (__bridge_transferNSMutableDictionary * )acfdic;
NSError * keyError = [NSErrorerrorWithDomain:@"domian"code:123userInfo:nil];
NSError * numError = [NSErrorerrorWithDomain:@"domian"code:456userInfo:nil];
[adicc setObject:numErrorforKey:keyError];
}
此时当对键于值进行进行retain,release操作时会调用retaincallbak ,releasecallbak,这时对键的操作就不是拷贝了,是保留。