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让开发者专注于感兴趣的 ...
随机推荐
- linux install sublime_text3
ubuntu & debian: (baidu or google) 1). download ***.deb to install inux系统下怎么安装.deb文件? deb 是 ubun ...
- goLang文件遍历
package main import ( "fmt" "io/ioutil" "os" "path/filepath&q ...
- hdu 5713(状态压缩DP)
要进行两次dp, 第一个,dp[i],1<=i<=(1<<n) 其中用i的二进制形式表示已选择的点. dp[i] 用来保存i中的点构成一个连通块,边集多少种可能. 转移方程: ...
- D3.js 弦图的制作
这是一种用于描述节点之间联系的图表. 1. 弦图是什么 弦图(Chord),主要用于表示两个节点之间的联系. 两点之间的连线,表示谁和谁具有联系: 线的粗细表示权重: 2. 数据 初始数据为: var ...
- python模块以及导入出现ImportError: No module named 'xxx'问题
python中,每个py文件被称之为模块,每个具有__init__.py文件的目录被称为包.只要模块或者包所在的目录在sys.path中,就可以使用import 模块或import 包来使用如果你要使 ...
- Css3_浏览器支持
#box{ color:red; ⁄* 所有浏览器都支持 *⁄ color:red !important; ⁄* Firefox.IE7支持 *⁄ _color:re ...
- matlab灰度变彩色+白平衡算法实现
% matlab彩色图像分离通道并合并成处理后的彩色图像(彩色变灰度再变彩色) % 白平衡算法(灰度世界法)消除RGB受光照影响 clear all; close all; %读入原始图像 srcIm ...
- servlet 文件上传简易版
package cn.itcast.servlet; import java.io.File;import java.io.IOException;import java.util.List; imp ...
- android内存耗用:VSS/RSS/PSS/USS
VSS- Virtual Set Size 虚拟耗用内存(包含共享库占用的内存) 不是真实当前应用进程所占用的内存. 内存分配的原理 从操作系统角度来看,进程分配内存有两种方式,分别由两个系统调用完 ...
- clip API实现遮罩
(function () { var img; var canvas = document.getElementById("canvas"); var con = canvas.g ...