什么是桥接?如何将coredata存储对象foundation对象和foundation对象进行桥接

12034人阅读
IOS之内存管理(1)
iphone(42)
Core Foundation框架&(CoreFoundation.framework)
是一组C语言接口,它们为iOS应用程序提供基本数据管理和服务功能。下面列举该框架支持进行管理的数据以及可提供的服务:
Core Foundation框架和Foundation框架紧密相关,它们为相同功能提供接口,但Foundation框架提供Objective-C接口。如果您将Foundation对象和Core Foundation类型掺杂使用,则可利用两个框架之间的 “toll-free bridging”。所谓的Toll-free
bridging是说您可以在某个框架的方法或函数同时使用Core Foundatio和Foundation 框架中的某些类型。很多数据类型支持这一特性,其中包括群体和字符串数据类型。每个框架的类和类型描述都会对某个对象是否为 toll-free bridged,应和什么对象桥接进行说明。
如需进一步信息,请阅读。
Objective-C指针与CoreFoundation指针之间的转换】
  ARC仅管理Objective-C指针(retain、release、autorelease),不管理CoreFoundation指针,CF指针由人工管理,手动的CFRetain和CFRelease来管理,注,CF中没有autorelease。
  CocoaFoundation指针与CoreFoundation指针转换,需要考虑的是所指向对象所有权的归属。ARC提供了3个修饰符来管理。
  1. __bridge,什么也不做,仅仅是转换。此种情况下:
    i). 从Cocoa转换到Core,需要人工CFRetain,否则,Cocoa指针释放后, 传出去的指针则无效。
    ii). 从Core转换到Cocoa,需要人工CFRelease,否则,Cocoa指针释放后,对象引用计数仍为1,不会被销毁。
  2. __bridge_retained,转换后自动调用CFRetain,即帮助自动解决上述i的情形。
  2. __bridge_transfer,转换后自动调用CFRelease,即帮助自动解决上述ii的情形。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:99995次
积分:1326
积分:1326
排名:千里之外
原创:34篇
转载:14篇
(1)(1)(3)(15)(24)(4)ARC模式下OC对象与非OC对象之间的桥接_shindow_新浪博客
ARC模式下OC对象与非OC对象之间的桥接
__bridge:不涉及对象所有关系改变
__bridge_transfer:给予 ARC 所有权(针对的是NS对象,相当于把CF对象所有权转交给NS对象)
__bridge_retained:解除 ARC
所有权(正对的是NS对象,相当于把NS所有权转交给CF对象)
在ARC中,OC对象与非OC对象在强制转换中,需要使用以上三个关键字进行桥接,那么三个关键字各用在什么情况下呢?
详解如下:下面一行代码:
CFStringRef s1 = (CFStringRef)[[NSString alloc]
initWithFormat:@”Hello, %d!”, 1];
在ARC下面会报编译问题(对象转换需要使用bridge),并会给出推荐的解决方案:
CFStringRef s1 = (__bridge CFStringRef)[[NSString
alloc] initWithFormat:@”Hello, %d!”, 1];
这里NSString生成的是OC的对象,内存由ARC负责。s1是CF的对象,内存还是需要自己手动管理。两个变量转换时需要添加桥接标识。上面这种情况下不会crash,也不会有内存泄露。
​因为alloc出来的内存会被ARC回收,这块内存的所有关系没变。如果后面加上CFRelease(s1);就会crash,因为这块内存还是归ARC管的,这样会过度释放。修改一下:CFStringRef
s1 = (__bridge_retained CFStringRef)[[NSString alloc]
initWithFormat:@”Hello, %d!”, 1];
这种情况下,对象的所有权交给CF对象了。就需要加上CFRelease(s1);进行释放,否则会产生泄露。
再看下面代码:CFUUIDRef uu = CFUUIDCreate(NULL);
CFStringRef s2 = CFUUIDCreateString(NULL, uu);
CFRelease(uu);
NSString* str = (__bridge NSString*)s2;
NSLog(@”STR:%@”,str);
CFRelease(s2);
这里的uu和s2都需要使用CFRelease释放,因为他们不是OC对象,并且是create出来的内存,并且所有权没有被释放。(保留了CF内存对象)
如果改动下面一行代码:
NSString* str = (__bridge_transfer NSString*)s2;
这时候运行程序会引起crash,因为s2的所有权已经交给ARC中的str了,ARC会负责释放这块内存。这时候调用CFRelease(s2);会造成过度释放。所以应该把这么行代给去了。
注:ARC模式下,自动回收只针对Objective-C对象有效,对于使用create,copy,retain等生成的Core
Foundation对象还是需要我们手动进行释放的,CFRelease().​
博客等级:
博客积分:0
博客访问:19,670
关注人气:0
荣誉徽章:iOS/oc(168)
在ARC环境下,编译器是不会处理c语言申请的内存,
在C语言和OC混合开发的时候,C语言指针和oc的指针相互转换的时候,使用桥接.
__bridge__transfer &将coreDatafoundation对象给了foundation,并且移交了对象管理权,不需要(foundation中使用coreDatafoundation)/CFBridgingRelease
__bridge & & & & & & & & &只是将coreDatafoundation对象给了foundation,并没有移交了对象管理权,需要
(foundation中使用coreDatafoundation)
__bridge__retained &(corefoundation 中使用foundation)
&& & CoreFoundation与Fundation框架的桥接 : 3种方式
&& & 1. __bridge& : 可以将CF对象转换成了Foiundation对象,
但是没有移交对象的所有权
&& & 2. __bridge_transfer / CFBridgingRelease :
可以将CF对象转换成了Foiundation对象,
同时移交对象的所有权
&& & 3. __bridge_retained :
可以将Foiundation对象转换成了CF对象.
这种方式使用几率非常低
& & //方式一:
先转换成CF& CF ---& NS& CFRelease
//& & CFStringRef firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
//& & CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
//& & NSString *firstNameStr = (__bridge NSString *)(firstName);
//& & NSString *lastNameStr = (__bridge NSString *)(lastName);
//& & NSLog(@&firstNameStr: %@&, firstNameStr);
//& & NSLog(@&lastNameStr: %@&,lastNameStr);
//& & //CF框架没有ARC机制
//& & CFRelease(firstName);
//& & CFRelease(lastName);
方式二: 直接转换成NSString
//& & NSString *firstNameStr = CFBridgingRelease(ABRecordCopyValue(person, kABPersonFirstNameProperty));
//& & NSString *lastNameStr = CFBridgingRelease(ABRecordCopyValue(person, kABPersonLastNameProperty));
方式三: 直接转换成NSString
& & NSString *firstNameStr = (__bridge_transfer
NSString *)ABRecordCopyValue(person,
kABPersonFirstNameProperty);
& & NSString *lastNameStr = (__bridge_transfer
NSString *)ABRecordCopyValue(person,
kABPersonLastNameProperty);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:31654次
积分:2497
积分:2497
排名:第12085名
原创:218篇
转载:28篇
(17)(17)(1)(2)(10)(37)(14)(54)(96)(2)(1)iOS中的桥接方式C -&OC& & &(__bridge tupe)expression &: 将CoreFoundation框架的对象所有权交给Foundation框架来使用,但是Foundation框架中的对象并不能管理该对象内存& & &(__bridge_transfer Objective-C type)expression : 将CoreFoundation框架的对象所有权交给Foundation来管理,如果Foundation中对象销毁,那么我们之前的对象(CoreFoundation)会一起销毁OC - &C& & &(__bridge_retained CF type)expression
最新教程周点击榜
微信扫一扫OC 和 Core Foundation 对象相互转换的内存管理 - 简书
OC 和 Core Foundation 对象相互转换的内存管理
iOS允许Objective-C 和 Core Foundation 对象之间可以轻松的转换,拿 NSString 和 CFStringRef 来说,直接转换豪无压力:
CFStringRef aCFString = (CFStringRef)aNSS
NSString *aNSString = (NSString *)aCFS
ARC的诞生大大简化了我们针对内存管理的开发工作,但是只支持管理 Objective-C 对象, 不支持 Core Foundation 对象。Core Foundation 对象必须使用CFRetain和CFRelease来进行内存管理。那么当使用Objective-C 和 Core Foundation 对象相互转换的时候,必须让编译器知道,到底由谁来负责释放对象,是否交给ARC处理。只有正确的处理,才能避免内存泄漏和double free导致程序崩溃。根据不同需求,有3种转换方式__bridge
(不改变对象所有权)__bridge_retained 或者 CFBridgingRetain()
(解除 ARC 所有权)__bridge_transfer 或者 CFBridgingRelease()
(给予 ARC 所有权)1. __bridge_retained 或者 CFBridgingRetain()__bridge_retained 或者 CFBridgingRetain()
将Objective-C对象转换为Core Foundation对象,把对象所有权桥接给Core Foundation对象,同时剥夺ARC的管理权,后续需要开发者使用CFRelease或者相关方法手动来释放对象。来看个例子:
- (void)viewDidLoad{
[super viewDidLoad];
NSString *aNSString = [[NSString alloc]initWithFormat:@"test"];
CFStringRef aCFString = (__bridge_retained CFStringRef) aNSS
(void)aCFS
//正确的做法应该执行CFRelease,没有release会内存泄露。
//CFRelease(aCFString);
CFBridgingRetain()
是 __bridge_retained 的宏方法,下面两行代码等价:
CFStringRef aCFString = (__bridge_retained CFStringRef) aNSS
CFStringRef aCFString = (CFStringRef) CFBridgingRetain(aNSString);}

我要回帖

更多关于 corefoundation 源码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信