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. goLang文件遍历

    package main import (  "fmt"  "io/ioutil"  "os"  "path/filepath&q ...

  2. JAVA调用C语言写的SO文件

    JAVA调用C语言写的SO文件 因为工作需要写一份SO文件,作为手机硬件IC读卡和APK交互的桥梁,也就是中间件,看了网上有说到JNI接口技术实现,这里转载了一个实例 // 用JNI实现 // 实例: ...

  3. 20160805_CentOS6_键盘快捷键

    1. 系统 -->首选项 --> 键盘快捷键 2. 3.

  4. testng标签运行顺序

    testng的annotations运行顺序为: @BeforeSuite @BeforeTest @BeforeClass @BeforeMethod @AfterMethod @AfterClas ...

  5. table合并单元格colspan和rowspan .

    colspan和rowspan这两个属性用于创建特殊的表格. colspan是“column span(跨列)”的缩写.colspan属性用在td标签中,用来指定单元格横向跨越的列数: 在浏览器中将显 ...

  6. dedecms5.7怎么取消邮箱验证以及dedecms 会员发布的文章不需要审核的解决方法

    后台 ——系统基本参数——会员设置——会员权限开通状态——改为0 1.实现会员发布文章不需要审核,非会员发布需要审核 在member这个文件夹下找到archives_sg_add.php这个文件,打开 ...

  7. VS2012更改项目编译后文件输出目录

    1.现在我的解决方案里有存在两个项目,分别是类库项目ClassLibrary1和控制台项目ConsoleApplication1,默认情况下当解决方案重新生成后,这两个项目所对应的编译后文件分别会存在 ...

  8. Completely disable mousewheel on a WinForm

    this.MouseWheel += new MouseEventHandler(Form_MouseWheel); private void Form_MouseWheel(object sende ...

  9. 为设计师准备的 20 个新的免费 PSD 模板

    设计师们每天的工作经常要用到各种模板,本文推荐 20 个新的免费 PSD 模板,可节省设计时间. Blueprint Notice PSD Wooden Drawer Icon Minimal Clo ...

  10. 《javascript高级程序设计》 第20章 JSON

    20.1 语法 20.1.1 简单值 20.1.2 对象 20.1.3 数组 20.2 解析与序列化 20.2.1 JSON 对象 20.2.2 序列化选项 20.2.3 解析选项 JSON 对象有两 ...