ARC 类型转换:显式转换 id 和 void *
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 *的更多相关文章
- id 与 void * 转换
MRC 环境下: id 变量赋值给 void * 变量运行时不会有问题. id obj1 = [NSObject new];void * p = obj1; void * 变量赋值给 id 变量并调用 ...
- Objective C中的ARC的修饰符的使用---- 学习笔记九
#import <Foundation/Foundation.h> @interface Test : NSObject /** * 默认的就是__strong,这里只是做示范,实际使用时 ...
- iOS的内存管理
在Objective-C 这种面向对象的语言里,内存管理是个重要的概念.要想用一门语言写出内存使用效率高而且又没有bug的代码,就得掌握其内存管理模型的种种细节. 一旦理解了这些规则,你就会发现,其实 ...
- iOS的内存管理和引用计数规则、Block的用法以及三种形式(stack、malloc、global)
学习内容 iOS的内存管理和引用计数规则 内存管理的思考方式 自己生成的对象自己持有 非自己生成的对象自己也能持有 自己持有的对象不需要时释放 非自己持有的对象不能释放 ARC有效时,id类型和对象类 ...
- ARC下带CF前缀的类型与OC类型转换
在对钥匙串操作时这个函数 OSStatus SecItemCopyMatching(CFDictionaryRef query, CFTypeRef * __nullable CF_RETURNS_R ...
- object-c 的ARC 问答/介绍
原文:http://blog.csdn.net/kmyhy/article/details/8895606 概念" Clangstatic analyzer "是一个非常有用的查找 ...
- ARC使用小结
内存管理基本原则 内存管理的依循下面的基本原则 自己生成的对象,那么既是其持有者 不是自己生成的对象,也可成为其持有者(一个对象可以被多个人持有) 如果不想持有对象的时候,必须释放其所有权 不能释放已 ...
- 一篇文章彻底弄清ARC始末
本文转载至 http://blog.csdn.net/allison162004/article/details/38758265 自动引用计数(ARC)是编译器的一个特色,提供了Objective- ...
- 转向ARC的说明
转自hherima的博客原文:Transitioning to ARC Release Notes(苹果官方文档) ARC是一个编译器特征,它提供了对OC对象自动管理内存.ARC让开发者专注于感兴趣的 ...
随机推荐
- Oracle分析函数的项目实践实例
SELECT * FROM SSE2_FLOW_EXPENSE T1 JOIN (SELECT SFEL.*, ROW_NUMBER() OVER(PARATITION BY SFEL.FE_EXPE ...
- JavaWeb学习总结(八)—Cookie
1.什么叫Cookie Cookie翻译成中文是小甜点,小饼干的意思.在HTTP中它表示服务器送给客户端浏览器的小甜点.其实Cookie就是一个键和一个值构成的,随着服务器端的响应发送给客户端浏览器. ...
- JavaWeb 4 XML
4 XML 1 XML入门 1.1 引入 HTML: 负责网页的结构 CSS: 负责网页的样式(美观) Javascript: 负责在浏 ...
- js获取时间格式化
http://www.cnblogs.com/zhangpengshou/archive/2012/07/19/2599053.html
- JSON对象如何转化为字符串?
序列化 定义 指将 JavaScript 值转化为 JSON 字符串的过程. JSON.stringify() 能够将 JavaScript 值转换成 JSON 字符串.JSON.stringify( ...
- xml中的xmlns,xmlns:xsi,xsi:schemaLocation有什么作用,如果没有会怎么样呢
如 maven 的 pom.xml 开头是下面这样的谁能解释下,这东西有社么用,不写这东西又会怎么样的,官方拷贝来的说明文档就算了,我想要简明扼要的说明.不胜感激---------<projec ...
- P92认识对话框
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- Mybatis 学习-2
创建基于session的util类,在线程中共享SqlSession package cn.smartapp.blogs.pojo; import java.io.Serializable; impo ...
- HDUOJ-----(1162)Eddy's picture(最小生成树)
Eddy's picture Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- 9. shell环境
• printenv –打印部分或所有的环境变量 • set –设置 shell 选项 • export —导出环境变量,让随后执行的程序知道. • alias –创建命令别名 1.shell环境:s ...