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让开发者专注于感兴趣的 ...
随机推荐
- maven pom.xml解释 (转)
maven3实战之maven使用入门(编写POM) ---------- maven项目的核心是pom.xml.POM(Project Object Model,项目对象模型)定义了项目的基本信息,用 ...
- asp.net开发中经常用到的方法
---天气插件--- <iframe width="560" scrolling="no" height="23" framebord ...
- python 标准库
https://www.zhihu.com/question/24590883 https://www.zhihu.com/question/20501628 http://blog.csdn.net ...
- Single Number III
Description: Given an array of numbers nums, in which exactly two elements appear only once and all ...
- 本地获取System权限CMD方法汇总(转)
本地获取System权限CMD方法汇总(转) 稍微整理了下,大概有三种方法可以本地获取system权限的cmd,但前提都是当前用户具备administrator权限. 下面列举的三种方法各有千秋,看你 ...
- 测试分页查询出数据并分文件导出[java工程]
package cn.shiyanjun.test; import java.util.ArrayList; import java.util.List; public class ExcelTest ...
- dede如何新建一个ajax服务端输出文件
<?phprequire_once(dirname(__FILE__)."/include/common.inc.php");AjaxHead(); $dsql-> ...
- iOS应用架构谈 本地持久化方案及动态部署
转载: iOS应用架构谈 本地持久化方案及动态部署 前言 嗯,你们要的大招.跟着这篇文章一起也发布了CTPersistance和CTJSBridge这两个库,希望大家在实际使用的时候如果遇到问题,就给 ...
- 倒计时原生js
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- jmeter 建立一个监控测试计划
监控 压力测试和系统管理是有用的. 使用压力 测试,服务器性能监控提供了额外的信息. 这也使得它更容易看到服务器性能之间的关系 在客户端和响应时间. 作为一个系统管理工具, 监控提供了一种简单的方法来 ...