ARC 类型转换:显示转换 id 和 void *
来源:互联网 发布:mac number 下拉菜单 编辑:程序博客网 时间:2024/05/20 20:43
/*
* 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 = [[NSObjectalloc] init];
void *p = (__bridgevoid *)obj;
id o = (__bridge id)p;
void *p = (__bridgevoid *)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_retainedvoid*)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_retainedvoid *)obj;
}
NSLog(@"class=%@", [(__bridgeid)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=%@", [(__bridgeid)p class]);
// __bridge_retained 转换 /////////////
/*
* __bridge_transfer 转换提供与 __bridge_retained相反的动作,
* 被转换的变量所持有的对象在该变量被赋值给转换目标变量后随后释放。
*/
// __bridge_transfer 转换 /////////////
// ARC 有效时的代码
id obj = (__bridge_transferid)p;
// ARC 无效时的代码
id obj = (id)p;
[obj retain];
[(id)p release];
// __bridge_transfer 转换 /////////////
/*
* 不使用id型或对象型变量也可以生成、持有以及释放对象。
* 虽然可以这样做,但在ARC中并不推荐这种方法。
*/
// ARC中并不推荐这种方法 /////////////
// ARC 有效时的代码
void *p = (__bridge_retainedvoid *)[[NSObject alloc] init];
NSLog(@"class=%@", [(__bridgeid)p class]);
(void)(__bridge_transferid)p;
// ARC 无效时的代码
id p = [[NSObject alloc] init];
NSLog(@"class=%@", [p class]);
[p release];
// ARC中并不推荐这种方法 /////////////
- ARC 类型转换:显示转换 id 和 void *
- ARC 类型转换:显示转换 id 和 void *
- ARC 类型转换:显示转换 id 和 void *
- ARC 类型转换:显示转换 id 和 void *
- void * 和int 类型转换
- 显式转换 id和void *
- __bridge 显式转换 id和void *
- void*类型转换
- ARC和MRC转换
- void*指针、类型转换和动态内存分配
- C#中隐式类型转换和显示类型转换
- C#中隐式类型转换和显示类型转换 .
- java中显示类型转换和隐式类型转换
- 项目ARC和非ARC转换
- mrc 和 arc的转换
- arc 转换
- ARC转换
- 类型转换(DWORD)(*m_pStroreMap)[(void*)pOb]
- OD条件与消息断点的设置方法
- Android 4.3 新特性
- QFtp 协议下载
- 关于Java中的匿名内部类
- Centos 6.3 编译安装Nginx+php+Mysql
- ARC 类型转换:显示转换 id 和 void *
- shell脚本加密
- LaTex中表格固定列宽并且居中的方法
- C#调用REST API
- 这位程序员桌面很干净
- uboot/board/mini2440/conifg.mk 之TEXT_BASE
- 敏捷的价值
- java获取当天的开始时间,当前周的开始时间
- 【Android内存机制分析】了解Android堆和栈