博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
__strong修饰符
阅读量:4980 次
发布时间:2019-06-12

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

本文用来观察,对于__strong修饰符,编译器为我们自动添加了什么代码,这些代码对于引用计数有什么影响。

例子一

X __strong *x1 = [[X alloc] init];

使用控制台打印引用计数,计数值为1,符合预期:

(lldb) p CFGetRetainCount((__bridge CFTypeRef)x1)(CFIndex) $0 = 1(lldb)

 

例子二

X __strong *x2 = [X create]; //create返回对象X

使用控制台查看引用计数,计数值为2:

(lldb) p CFGetRetainCount((__bridge CFTypeRef)x2)(CFIndex) $1 = 2(lldb)

计数值为2,说明x2被持有了两次,使用clang的-S选项查看汇编文件:

.loc    1 40 7 is_stmt 0        ## autorelease.m:40:7  调用[X create]的源码处    movq    %rax, %rdi    callq    _objc_retainAutoreleasedReturnValue  ##返回的autoreleased值被又持有了一次    xorl    %ecx, %ecx    movl    %ecx, %esi    movq    %rax, -24(%rbp)

发现编译器对于返回的autoreleased值(即由非alloc/new/init/copy/mutableCopy开头的方法返回的值)调用了一次Retain方法。

 

例子三

X __storng *x1 = [[X alloc] init]; X __strong *x2 = x1;

在Xcode控制台查看引用计数,结果为2,说明对__strong变量赋值操作,也会导致引用计数加1:

(lldb) p CFGetRetainCount((__bridge CFTypeRef)x1)(CFIndex) $2 = 2(lldb) p CFGetRetainCount((__bridge CFTypeRef)x2)(CFIndex) $3 = 2(lldb)

查看汇编代码,发现赋值操作编译器也会自动插入Retian操作:

.loc    1 40 7                  ## autorelease.m:40:7  调用[[X alloc] init]处    movq    %rax, -24(%rbp)    .loc    1 41 12 is_stmt 1       ## autorelease.m:41:12 x2 = x1处    movq    -24(%rbp), %rax    movq    %rax, %rdi    callq    *_objc_retain@GOTPCREL(%rip)  ##赋值的时候,也会调用Retian方法

 

总结

对于__strong修饰符,编译器会根据情况插入Retain方法:

1 如果是alloc/init/new/copy/mutableCopy方法或者以他们作为方法名开头的方法来给__strong变量赋值,编译器不会插入Retain方法

2 如果是非1所指的方法,或者是把一个变量赋给一个__strong变量,编译器都会插入相应的Retain方法

 

转载于:https://www.cnblogs.com/chaoguo1234/p/11147204.html

你可能感兴趣的文章
[BZOJ] 1625: [Usaco2007 Dec]宝石手镯
查看>>
.net垃圾回收学习【C#中的Stack和heap]【续1】
查看>>
bzoj4520【cqoi2016】K远点对
查看>>
springboot整合redis进行数据缓存
查看>>
node+multiparty+ajax 上传图片并保存到数据库
查看>>
python flask 解决中文乱码
查看>>
ArcSDE 管理工具[原创]
查看>>
EF5 新增枚举类型(Enum)
查看>>
如何整站下载ftp目录内容
查看>>
UNITY引擎变量调用产生不必要内存分配
查看>>
WPF 动态绑定listview的列内容
查看>>
loadrunner运行时设置中清空缓存方法
查看>>
Sphinx全文检索之PHP使用教程
查看>>
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(1)(转)
查看>>
【总结】移动web问题小结
查看>>
游标示例
查看>>
Atitit.软件仪表盘(4)--db数据库子系统-监测
查看>>
Atitit ftp原理与解决方案
查看>>
Atitit 项目的主体设计与结构文档 v3
查看>>
第10章:MongoDB-CRUD操作--文档--修改--修改器
查看>>