博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ARC 类型转换:显式转换 id 和 void *
阅读量:6767 次
发布时间:2019-06-26

本文共 2102 字,大约阅读时间需要 7 分钟。

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中并不推荐这种方法 /

转载于:https://www.cnblogs.com/Keys/p/4532646.html

你可能感兴趣的文章
文本处理三剑客之sed基础用法
查看>>
IOS 各版本下载地址
查看>>
【行为型】- 迭代器模式
查看>>
邮件系统5大绝招解决中毒难题!!!
查看>>
hessian应用示例
查看>>
json_decode和json_encode的用法
查看>>
maven中引用JDK中的tools.jar
查看>>
Linux共享库注入后门
查看>>
程序员必备! 向您推荐一款APP开发和测试的工具!
查看>>
【SQL Server学习笔记】XML、分层、空间数据
查看>>
ElsticStake安装之Logstash6.4.0 安装(二)
查看>>
chrome 快捷键
查看>>
××× 错误代码789
查看>>
grep
查看>>
H3C开启tracert路径回显ip ttl和ip unreahables命令都要配置的原因
查看>>
Mysql完全备份和恢复
查看>>
Skia深入分析7——区域解码
查看>>
单链表的折半查找,冒泡排序,选择排序
查看>>
WebM (VP8) vs H.264
查看>>
字符串相关函数的模拟实现
查看>>