ios桥接 bridge

使用无缝桥接技术可以在定义于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,这时对键的操作就不是拷贝了,是保留。

 

 

 

你可能感兴趣的:(ios开发技术点,开发知识总结)