http://blog.csdn.net/chinahaerbin/article/details/9471419

/*

* ARC有效时三种类型转换:

*/

1、__bridge          // 转换

2、__bridge_retained // 转换

3、__bridge_transfer // 转换

// __bridge 转换 //////////////////////

// ARC无效时 对应的代码

id obj = [[NSObject alloc] init];

void *p = obj;

id o = p;

[o release];

// 在 ARC 有效时 通过 __bridge转换 id 和 void * 就能够相互转换

id obj = [[NSObject alloc] init];

void *p = (__bridge void *)obj;

id o = (__bridge id)p;

void *p = (__bridge void *)obj;

id o = (__bridge id)p;

/*

* 通过 __bridge 转换, id 和 void * 就能够相互转换。

* 但是转换为 void * 的 __bridge 转换,其安全性与赋值给 __unsafe_unretained 修饰符相近,

* 甚至会更低。如果管理时不注意赋值对象的所有者,就会因悬垂指针而导至程序崩溃。

*/

// __bridge 转换 //////////////////////

/*

* __bridge_retained 转换可使要转换赋值的变量也持有所赋值的对象.

*/

// __bridge_retained 转换 /////////////

// ARC 有效时的代码

id obj = [[NSObject alloc] init];

void *p = (__bridge_retained void*)obj;

// ARC 无效时的代码

id obj = [[NSObject alloc] init];

void *p = obj;

[(id)p retain];

// __bridge_retained ARC 转换

void *p = 0;

{

id obj = [[NSObject alloc] init];

p = (__bridge_retained void *)obj;

}

NSLog(@"class=%@", [(__bridge id)p class]);

/*

* 变量作用域结束时,虽然随着持有强引用的变显obj失效,对象随之释放,

* 但由于 __bridge_retained 转换使变量p看上去处于持有该对象的状态,

* 因此该对象不会被废弃。下面我们比较一下ARC无效时的代码是怎样的。

*/

// ARC 无效时的代码

void *p = 0;

{

id obj = [[NSObject alloc] init]; /* [obj retainCount] -> 1 */

p = [obj retain];     /* [obj retainCount] -> 2 */

[obj release];      /* [obj retainCount] -> 1 */

}

/*

* [(id)p retainCount] -> 1

* 即

* [obj retainCount] -> 1

* 对象扔存在

*/

NSLog(@"class=%@", [(__bridge id)p class]);

// __bridge_retained 转换 /////////////

/*

* __bridge_transfer 转换提供与 __bridge_retained 相反的动作,

* 被转换的变量所持有的对象在该变量被赋值给转换目标变量后随后释放。

*/

// __bridge_transfer 转换 /////////////

// ARC 有效时的代码

id obj = (__bridge_transfer id)p;

// ARC 无效时的代码

id obj = (id)p;

[obj retain];

[(id)p release];

// __bridge_transfer 转换 /////////////

/*

* 不使用id型或对象型变量也可以生成、持有以及释放对象。

* 虽然可以这样做,但在ARC中并不推荐这种方法。

*/

// ARC中并不推荐这种方法 /////////////

// ARC 有效时的代码

void *p = (__bridge_retained void *)[[NSObject alloc] init];

NSLog(@"class=%@", [(__bridge id)p class]);

(void)(__bridge_transfer id)p;

// ARC 无效时的代码

id p = [[NSObject alloc] init];

NSLog(@"class=%@", [p class]);

[p release];

// ARC中并不推荐这种方法 /////////////

ARC 类型转换:显式转换 id 和 void *的更多相关文章

  1. id 与 void * 转换

    MRC 环境下: id 变量赋值给 void * 变量运行时不会有问题. id obj1 = [NSObject new];void * p = obj1; void * 变量赋值给 id 变量并调用 ...

  2. Objective C中的ARC的修饰符的使用---- 学习笔记九

    #import <Foundation/Foundation.h> @interface Test : NSObject /** * 默认的就是__strong,这里只是做示范,实际使用时 ...

  3. iOS的内存管理

    在Objective-C 这种面向对象的语言里,内存管理是个重要的概念.要想用一门语言写出内存使用效率高而且又没有bug的代码,就得掌握其内存管理模型的种种细节. 一旦理解了这些规则,你就会发现,其实 ...

  4. iOS的内存管理和引用计数规则、Block的用法以及三种形式(stack、malloc、global)

    学习内容 iOS的内存管理和引用计数规则 内存管理的思考方式 自己生成的对象自己持有 非自己生成的对象自己也能持有 自己持有的对象不需要时释放 非自己持有的对象不能释放 ARC有效时,id类型和对象类 ...

  5. ARC下带CF前缀的类型与OC类型转换

    在对钥匙串操作时这个函数 OSStatus SecItemCopyMatching(CFDictionaryRef query, CFTypeRef * __nullable CF_RETURNS_R ...

  6. object-c 的ARC 问答/介绍

    原文:http://blog.csdn.net/kmyhy/article/details/8895606 概念" Clangstatic analyzer "是一个非常有用的查找 ...

  7. ARC使用小结

    内存管理基本原则 内存管理的依循下面的基本原则 自己生成的对象,那么既是其持有者 不是自己生成的对象,也可成为其持有者(一个对象可以被多个人持有) 如果不想持有对象的时候,必须释放其所有权 不能释放已 ...

  8. 一篇文章彻底弄清ARC始末

    本文转载至 http://blog.csdn.net/allison162004/article/details/38758265 自动引用计数(ARC)是编译器的一个特色,提供了Objective- ...

  9. 转向ARC的说明

    转自hherima的博客原文:Transitioning to ARC Release Notes(苹果官方文档) ARC是一个编译器特征,它提供了对OC对象自动管理内存.ARC让开发者专注于感兴趣的 ...

随机推荐

  1. 控制反转和spring在项目中可以带来的好处

    Spring实例化Bean的三种方式分别是: 1,xml配置使用bean的类构造器 <bean id="personService" class="cn.servi ...

  2. JavaWeb学习总结(六)—HttpServletResponse

    Response概述: response是Servlet.service方法的一个参数,类型为javax.servlet.http.HttpServletResponse.在客户端发出每个请求时,服务 ...

  3. Centos升级Python及pip

    因为CentOS系统中旧版本的Python已被深度依赖,所以不能卸载原有的Python,只能全新安装. 1.从官网下载: wget https://www.python.org/ftp/python/ ...

  4. (四)主控板改IP,升级app,boot,mac

    给主控板升级boot要在boot界面进行,进入boot后,要先查看boot下ip和掩码是否和电脑ip(severip)在一个网段,不在的话要使用setenv命令设置ip地址和掩码.之后再输入upboo ...

  5. (五)stm32工程代码HardFault异常查错调试方法

    一.导致异常的原因很多,例如:直接使用未分配空间的指针.栈溢出等一场非法操作便会使程序进入HardFault异常状态.下面介绍怎么找出程序中的异常. 接下来在keil_MDK工程中,编译代码,并deb ...

  6. SonarLint插件的安装与使用

    注意:版本要求Eclipse(4.2,3.8)以上,Java3.1.2,JavaScript 2. 一.SonarLint插件的安装方式 1.安装方式一:在线安装 1)Eclipse工具栏选择Help ...

  7. Web服务器异常问题记录

    1.使用命令,出现"-bash: 命令: Input/output error" 重启服务器后正常,网上查了下是说硬盘写入读取异常,经过和服务器厂商沟通后,确认是硬件问题导致(硬盘 ...

  8. ORA-00205

    场景 数据库启动时报错.关闭前还是正常运行的,再次启动时,就报了以下错误. Copyright (c) , , Oracle. All rights reserved. Connected to an ...

  9. SAP 用事务码SQVI 做简单报表 .

    集团计划总监要去德国参展,要一份离当前日期最近的出口欧美国家产品单价. 需要从A903,MARA,KONP,MATK 这4张表里取数. 1)Tcode:SQVI进入,如图 2) 在快速浏览处输入名称: ...

  10. Unity视频播放的各种实现方式汇总

    http://www.taidous.com/bbs/article-860-1.html  Unity视频播放有很多种实现方式,可根据要求来选择适当的实现,这里总结一下: 1. MovieTextu ...