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

例子一

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

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

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

例子二

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

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

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

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

.loc       is_stmt         ## autorelease.m::  调用[X create]的源码处
movq %rax, %rdi
callq _objc_retainAutoreleasedReturnValue ##返回的autoreleased值被又持有了一次
xorl %ecx, %ecx
movl %ecx, %esi
movq %rax, -(%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) $ =
(lldb) p CFGetRetainCount((__bridge CFTypeRef)x2)
(CFIndex) $ =
(lldb)

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

.loc                        ## autorelease.m::  调用[[X alloc] init]处
movq %rax, -(%rbp)
.loc is_stmt ## autorelease.m:: x2 = x1处
movq -(%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方法

__strong修饰符的更多相关文章

  1. Objective C中的ARC的修饰符的使用---- 学习笔记九

    #import <Foundation/Foundation.h> @interface Test : NSObject /** * 默认的就是__strong,这里只是做示范,实际使用时 ...

  2. ARC下的所有权修饰符

    ARC有效时,id类型必须加上所有权修饰符 下面为三种等效的声明,为了便于和二级指针的情况联系起来,采用第一种. NSError * __weak error = nil; NSError __wea ...

  3. iOS 基础日记-修饰符

    今晚随便温习了一下iOS 基础关于修饰符这块的东西,下面简单的来描述一下,其中有的也是在网络学习到的: strong与weak是由ARC新引入的对象变量属性 ARC的解释:ARC引入了新的对象的生命周 ...

  4. __block和__weak修饰符的区别

    block下循环引用的问题 __block本身并不能避免循环引用,避免循环引用需要在block内部把__block修饰的obj置为nil __weak可以避免循环引用,但是其会导致外部对象释放了之后, ...

  5. 01 (OC)* @property 后面可以有哪些修饰符?

    一:@property 后面可以有哪些修饰符? 1:线程安全的: atomic,nonatomic 2:访问权限的 readonly,readwrite 3:内存管理(ARC) assign, cop ...

  6. JAVA语言中的修饰符

    JAVA语言中的修饰符 -----------------------------------------------01--------------------------------------- ...

  7. Java类访问权限修饰符

    一.概要 通过了解Java4种修饰符访问权限,能够进一步完善程序类,合理规划权限的范围,这样才能减少漏洞.提高安全性.具备表达力便于使用. 二.权限表 修饰符 同一个类 同一个包 不同包的子类 不同包 ...

  8. iOS 方法修饰符

     一.NS_DESIGNATED_INITIALIZER 用来修饰init方法,被修饰的方法称为designated initializer:没有被这个修饰的init方法称为convenience i ...

  9. C#基础回顾(一)—C#访问修饰符

    一.写在前面的话 好久没有停下来总结自己,转眼间15年过去好些天,回首过去的日子,亦或失去,亦或所得!生活的节奏,常常让我们带着急急忙忙的节奏去追赶,也许这并不是每个人所期望的生活方式!于他人,于自己 ...

随机推荐

  1. 获得 Client 的相关信息

    1.获得 Client 的相关信息 package com.shine.sun.small; import java.net.InetAddress; @Slf4j public class netI ...

  2. CSS3 的动画属性

    通过 CSS3,我们能够创建动画,这可以在许多网页中取代动画图片.Flash 动画以及 JavaScript. ㈠@keyframes 规则 ⑴浏览器支持 Firefox 支持替代的 @-moz-ke ...

  3. Haystack全文检索框架

    一.什么是Haystack Haystack是django的开源全文搜索框架(全文检索不同于特定字段的模糊查询,使用全文检索的效率更高 ),该框架支持Solr,Elasticsearch,Whoosh ...

  4. Linux下不同组件运行命令

    Spark优化配置 添加外包路径 1.1 vim $SPARK_HOME/conf/spark-defaults.conf spark.executor.extraClassPath file:/// ...

  5. hdu 4763 看毛片(单纯next数组的应用--纯正O(n))

    因为需要负责队内的字符串题,开始刷,做到这道,开始想不出来,上网找题解, 然后就惊了,为什么你们这么暴力都可以过的啊,1e6啊,后来又想了下会做了 贴下代码 #include <iostream ...

  6. oracle判断一个字段为空

    比如 insert into table a (a1,b1)values("a1",''); 对于这种情况,因为表里存的是'',其实是没有内容的,要查询这个字段,不能直接使用 se ...

  7. 查准率(precision)和召回率(recall)

    1.定义 查准率(precision):预测患有癌症且预测正确的人数 / 预测有多少人患有癌症 召回率(recall):预测患有癌症且预测正确的人数 / 实际有多少人患有癌症 2.关系 他俩的关系如下 ...

  8. 20191017-2 alpha week 2/2 Scrum立会报告+燃尽图 01

    本次作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/9798 一.小组情况组长:贺敬文组员:彭思雨 王志文 位军营 杨萍队名: ...

  9. 后盾网lavarel视频项目---图片上传

    后盾网lavarel视频项目---图片上传 一.总结 一句话总结: 前端还是普通的前端操作,前端上传图片的地址就是图片上传的路由,后端代码也很简单 public function uploader(R ...

  10. How does ASP.NET Forms Authentication really work?

    I've always wondered how exactly ASP.NET forms authentication works. Yes, I know how to configure Fo ...