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. 机器学习如何选择模型 & 机器学习与数据挖掘区别 & 深度学习科普

    今天看到这篇文章里面提到如何选择模型,觉得非常好,单独写在这里. 更多的机器学习实战可以看这篇文章:http://www.cnblogs.com/charlesblc/p/6159187.html 另 ...

  2. Make 教程

    Make 命令教程 原文作者: 阮一峰 原文链接:http://www.ruanyifeng.com/blog/2015/02/make.html (在原文基础上稍作修改) 代码变成可执行文件,叫做编 ...

  3. HttpURLConnection请求接口

    import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.DataOutputStream; ...

  4. Java 两个变量交换值

    package test; public class Test {    public static void main(String[] args) {        int a, b;       ...

  5. Apache mod_jk

    http://tomcat.apache.org/connectors-doc/generic_howto/loadbalancers.html http://tomcat.apache.org/co ...

  6. mysql数据库回滚

    在应用$mysqli时,因没常用到数据回滚,老忘,整理下,做个记录. $mysqli->autocommit(FALSE);//自动提交设置关闭 $mysqli->query(" ...

  7. iOS 沙盒(sandbox)机制和文件操作

    本文参看了 http://www.uml.org.cn/mobiledev/201209211.asp#1 这篇文章中的介绍,尊重原著. 1.IOS沙盒机制 IOS应用程序只能在本应用程序中创建的文件 ...

  8. iOS设置app应用程序文件共享

    1.iOSapp应用程序文件共享 当我们用itnues连接到设备时,在应用程序栏目下面,文件共享下,点击 对应的程序,即可以在程序右边栏目里面看到应用程序共享的数据, 此时,我们可以通过右下角的 添加 ...

  9. semantic-ui使用gulp执行build-css报错

    1.执行gulp build-css报错 [09:40:49] Starting 'build-css'... Building CSS Potentially unhandled rejection ...

  10. AHCI驱动安装

    目录 第1章 Windows XP    1 1.1 更新驱动    1 第2章 Windows 7    7 2.1 修改注册表    7 2.2 更新驱动    7 第1章 Windows XP ...