__bridge 使用注意

前奏

在平常开发中,我们可能遇到 CoreFoundation(CF) 框架的对象和 OC 对象之间的类型转换,这时候我们需要 __bridge 来帮忙
注意 : 如果是使用 CF

__bridge

  • CF -> OC (只完成类型转换)
- (void)bridgeCF2OC{
    CFStringRef aCFString = CFStringCreateWithCString(NULL, "bridge", kCFStringEncodingASCII);
    self.myString = (__bridge NSString *)(aCFString);

    (void)aCFString;

    NSLog(@"bridge--%@",self.myString);
    /*
        __bridge 关键字只负责 CF 到 OC 之间的对象类型转换,并没有把内存管理的权限交给 ARC,因此不管 ARC 还是 MRC 我们都需要管理 CF 对象的内存
     */
    CFRelease(aCFString);
}
  • OC -> CF (只完成类型转换)
    NSString *aString = [NSString stringWithFormat:@"test"];
    CFStringRef cString = (__bridge CFStringRef)(aString);
    /*
        现在 String 的生命在 OC 手上,CF无法干预内存管理
     */
    // CFRelease(cString);
    NSLog(@"%@",cString);

__bridge_transfer 或者 CFBridgingRelease()

  • CF -> OC (完成类型转换的同时,赋予了ARC管理内存的权限,CF还是有权限的)
  • NSString *aNSString = [[NSString alloc]initWithFormat:@"test"];
      CFStringRef aCFString = (__bridge_retained CFStringRef) aNSString;
      // 赋予ARC 管理内存的权利
      aNSString = (__bridge_transfer NSString *)aCFString;
      aNSString = nil;
      // 这里已经把权限交给了 ARC 了,如果ARC已经释放了内存,那么CF对象还是无法读取内存
      // NSLog(@"%@",aCFString);
      // CFRelease(aCFString);
      // NSLog(@"%@",aNSString);

__bridge_retained 或者 CFBridgingRetain()

  • OC -> CF (完成类型转换的同时,剥夺了ARC管理内存的权限,CF还是有权限的)
NSString *aString = [NSString stringWithFormat:@"test"];
    // 这时候对象的生命 周期管理责任交给 CF 了
    CFStringRef cString = (__bridge_retained CFStringRef)(aString);
    // 原对象的内存并不会因此而销毁
    aString = nil;
    NSLog(@"%@",cString);
    // 正确的释放方法 :
    CFRelease(cString);

转自:http://www.jianshu.com/p/1cc4bf898bf1

时间: 2024-12-23 21:31:38

__bridge 使用注意的相关文章

浅解ARC中的 __bridge、__bridge_retained和__bridge_transfer

文章来源:http://www.outflush.com/2015/03/introduction-of-arc-bridge-type-transfer/ 在对 bridge 相关的修饰符解说前.首先了解下面内容 Core Foundation 是一组C语言接口.它与Foundation为相同功能提供接口.仅仅是Foundation框架提供的是Objective-C接口. Core Foundation中的对象也存在引用计数的概念,相似于Foundation的retain/release,其相

__bridge,__bridge_transfer和__bridge_retained的使用和区别【转载】

Core Foundation 框架Core Foundation框架 (CoreFoundation.framework) 是一组C语言接口,它们为iOS应用程序提供基本数据管理和服务功能.下面列举该框架支持进行管理的数据以及可提供的服务: 群体数据类型 (数组.集合等)程序包字符串管理日期和时间管理原始数据块管理偏好管理URL及数据流操作线程和RunLoop端口和soket通讯Core Foundation框架和Foundation框架紧密相关,它们为相同功能提供接口,但Foundation

__bridge

在ARC中,使用到和c语言对应的数据类型,应该使用__bridge 桥接 在MRC中,不需要桥接 在OC中,如果是ARC的话,编译的时候会自动添加 retain.release.autorelease ARC只负责OC的代码,不负责c的代码 如果c语言的框架 中,函数名中出现create.retain.copy,需要release 桥接的目的就是解决上述问题

__bridge之谜转自(http://www.cnblogs.com/goodleixiao/articles/2517911.html)

__bridge只做类型转换,但是不修改对象(内存)管理权: __bridge_retained(也可以使用CFBridgingRetain)将Objective-C的对象转换为Core Foundation的对象,同时将对象(内存)的管理权交给我们,后续需要使用CFRelease或者相关方法来释放对象: __bridge_transfer(也可以使用CFBridgingRelease)将Core Foundation的对象转换为Objective-C的对象,同时将对象(内存)的管理权交给ARC

__bridge_retained/__bridge_transfer/__bridge使用详解

第一.__bridge_retained的使用 __bridge_retained转换可使要转换的变量也持有所赋值的对象 void *p=0; { id obj=[[NSObject alloc] init]; p=(__bridge_retained void*)obj; } NSLog(@"class=%@",[(__bridge id)p class]); 输出结果: class=NSObject 分析: 变量作用域结束后,虽然obj失效,__bridge_retained转换使

关于block以及__bridge的一些笔记

问题概要 _block是否是一个OC对象? __bridge相关. _block是否是一个OC对象? 结论 一般来说,block可以看做一个OC对象,但是在编译器底层,block又可以被细分为block对象,独立于OC对象的存在. 分析 根据苹果官方文档,明确的指明block是一个OC对象.有兴趣的在文档里面搜索Working with Blocks. 根据文档Clang 4.0 documentation里面描述的,这里引入一个概念--可保留对象指针(retainable object poi

__bridge,__bridge_transfer和__bridge_retained详解

Core Foundation 框架Core Foundation框架 (CoreFoundation.framework) 是一组C语言接口,它们为iOS应用程序提供基本数据管理和服务功能.下面列举该框架支持进行管理的数据以及可提供的服务: 群体数据类型 (数组.集合等)程序包字符串管理日期和时间管理原始数据块管理偏好管理URL及数据流操作线程和RunLoop端口和soket通讯Core Foundation框架和Foundation框架紧密相关,它们为相同功能提供接口,但Foundation

expected expression __bridge

expected expression 一般为 标点符号引起的警告 () 或{} // 使用 core foundation 框架,ARC环境下需要:(__bridge NSString*) 修饰或(__bridge id)修饰 NSString * s = (id) (__bridge NSString*)kSecAttrAccount; [wrapper setObject:@"<账号>" forKey:(__bridge id)kSecAttrAccount ]; e

iOS开发之__bridge,__bridge_transfer和__bridge_retained

本文转至:http://www.qingpingshan.com/rjbc/ios/157477.html 引言 Core Foundation框架 (CoreFoundation.framework) 是一组C语言接口,它们为iOS应用程序提供基本数据管理和服务功能.下面列举该框架支持进行管理的数据以及可提供的服务: 1.群体数据类型 (数组.集合等) 2.程序包 3.字符串管理 4.日期和时间管理 5.原始数据块管理 6.偏好管理 7.URL及数据流操作 8.线程和RunLoop 9.端口和

IOS开发之 __bridge __bridge_transfer和__bridge_retained

Core Foundation 框架 Core Foundation框架 (CoreFoundation.framework) 是一组C语言接口,它们为iOS应用程序提供基本数据管理和服务功能.下面列举该框架支持进行管理的数据以及可提供的服务: 群体数据类型 (数组.集合等) 程序包 字符串管理 日期和时间管理 原始数据块管理 偏好管理 URL及数据流操作 线程和RunLoop 端口和soket通讯 Core Foundation框架和Foundation框架紧密相关,它们为相同功能提供接口,但