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. Java中List Set Map 是否有序等总结

    1.Collection List Set Map 区别记忆 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文 ...

  2. Spring集成JPA提示Not an managed type

    在做Spring与JPA集成时,出现问题如下: Caused by: java.lang.IllegalArgumentException: Not an managed type: class co ...

  3. Node.js superagent 采集 URL 编码问题

    今天在用Node学习采集的时候遇到一个问题,如这个链接地址 http://www.meishij.net/胡萝卜  就是用浏览器的方式访问链接可以打开,但用superagent 去模拟请求,就请求不到 ...

  4. 【linux命令】:查看系统运行状态,命令top 【转载】

    原文:http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316399.html 简介 top命令是Linux下常用的性能分析工具,能够实时显示系 ...

  5. D3.js 选择元素和绑定数据/使用数据

    选择元素和绑定数据是 D3 最基础的内容,本文将对其进行一个简单的介绍. 一.如何选择元素 在 D3 中,用于选择元素的函数有两个: d3.select():是选择所有指定元素的第一个 d3.sele ...

  6. PostgreSQL 8.1 中文文档(转)

    PostgreSQL 8.1 中文文档(转) http://www.php100.com/manual/PostgreSQL8/ 或者点击下面链接 PostgreSQL 8.1 中文文档

  7. 转!!java反射机制

    Java 反射机制 基本概念 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? 答案是肯定的. 这种动态获取类的信息以及动态调用对象 ...

  8. 转!!各种数据库的jdbc驱动下载及连接方式

    各种数据库驱动 数据库名称 下载地址 说明 Mysql http://www.mysql.com/products/connector/j/ Shipped. But need to download ...

  9. 让页面滑动流畅得飞起的新特性:Passive Event Listeners

    版权声明:本文由陈志兴原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/153 来源:腾云阁 https://www.qclo ...

  10. android GC内存回收小析

    由于时间问题,简单的谈谈自己的理解. 大家都知道,在android开发中,不需要自己去管理,有垃圾回收机制会自动帮我们去回收 没有被引用到的对象. 那垃圾回收机制到底是怎样的呢?下面列出本人的一些理解 ...