block与copy关系的恩怨情仇,你就不想知道吗?

简介: 一、哪些情况block自动copy到堆上?二、堆栈上的block对auto变量的引用是什么关系?2.1、block是在栈上2.2、block被拷贝到堆上2.3、block从堆中删除

通过block有哪些对象类型这篇文章,我们知道了不同类型的block调用copy后的结果如下图所示:

ca061b1b9d174d26be90213999982d9b.png


一、哪些情况block自动copy到堆上?


在ARC环境下,编译器会根据情况自动将栈上的block复制到堆上,比如以下情况


1、block作为函数返回值时。

2、将block赋值给__strong指针时。

3、block作为Cocoa API中方法名含有usingBlock的方法参数时。

4、block作为GCD API的方法参数时。


MRC下block属性的建议写法


@property (copy, nonatomic) void (^block)(void);

ARC下block属性的建议写法


@property (strong, nonatomic) void (^block)(void);
@property (copy, nonatomic) void (^block)(void);

为了统一写法,建议都是用 copy 修饰:


@property (copy, nonatomic) void (^block)(void);

二、堆栈上的block对auto变量的引用是什么关系?


2.1、block是在栈上

不会对auto变量产生强引用。


因为block本身随时会被销毁,所以对auto变量强引用没有什么意义。


2.2、block被拷贝到堆上

– > 会调用block内部的 copy 函数

------ > copy 函数内部会调用_Block_object_assign函数

--------------> _Block_object_assign 函数会根据 auto 变量的修饰符(__weak,__strong,__unsafe_unretained)做出相应的操作,类似于retain(形成强引用、若引用)。


2.3、block从堆中删除

– > 会调用block内部的 dispose 函数

------ > dispose函数内部会调用 _Block_object_dispose 函数

--------------> _Block_object_dispose 函数会自动释放引用的auto变量,类似于release.


注意:

__weak 弱引用需要运行时支持,需要增加运行时编译:


xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc -fobjc-runtime=ios-8.0.0 main.m


相关文章
|
6月前
|
机器学习/深度学习 数据挖掘 Go
JCR一区5.2分|RNA修饰如何打开格局,一篇非肿瘤m6A带入门
这篇文章探讨了m6A修饰在绝经后骨质疏松症(PMOP)中的作用,通过生物信息学分析和实验验证,鉴定了7个m6A调节剂作为诊断标志物。研究发现这些调节剂可能影响疾病的亚型分类,并提出了m6A模式作为潜在的治疗靶点。文章提供了PMOP新的分子机制理解,为未来诊断和免疫治疗策略提供了依据。
79 0
|
Python
Data Science | 时期时间傻傻分不清楚
Data Science | 时期时间傻傻分不清楚
|
C++
爱上c++的第十天:共用数据的保护(const)
最近事情还是比较多,我的心态也出现了一些小问题,目前也在积极的调整,想学的东西太多,但是又不是那么容易学,不可避免的产生了一些消极的态度,老师也是对我很好,帮助我调整状态,很快我也会慢慢的持续变好,我自己也相信自己。好了,开始我们今天的学习。
96 0
|
Java 测试技术 API
满地坑!细数List的10个坑
今天我们主要来说一说List操作在实际使用中有哪些坑,以及面对这些坑的时候我们要怎么解决。
|
机器学习/深度学习 数据可视化 数据挖掘
如何开始一项可能帮助你走向人生巅峰的“业余项目”(Side Project)?
你知道什么是side project 吗? 你知道如何开始一个side project 吗?一个业余项目,不仅可以给你带去知识、技能、满足感,也可能从此改变你的职业生涯。俗话说,万事开头难,本文作者列了5条经验,帮助你快速地、有目标的进入一个side project。
1891 0
|
SQL Web App开发
艾伟:从别人那拷下来的几点Session使用的经验(转载)
问:当页面中是否了frameset,发现在每个frame中显示页面的SessionID在第一次请求时都不相同,为什么?答:原因是你的frameset是放在一个htm页面上而不是ASPX页面。在一般情况下,如果frameset是aspx页面,当你请求页面时,它首先将请求发送到Web服务器,此时已经获得了SessionID,接着浏览器会分别请求Frame中的其他页面,这样所有页面的SessionID就是一样的,就是FrameSet页面的SessionID。
878 0
零元学Expression Design 4 - Chapter 7 使用内建功能「Clone」来达成Path的影分身之术
原文:零元学Expression Design 4 - Chapter 7 使用内建功能「Clone」来达成Path的影分身之术 本章所介绍的是便利且快速的内建工具Clone ? 本章所介绍的是便利且快速的内建工具Clone ? ? 为什麽会说像是影分身之术呢? ? 请参照火影忍者(NARUTO): 《分身术》会分身术者,能以一身分出几身,几十身,乃至千百身。
1227 0
|
JSON 前端开发 API
剥开比原看代码16:比原是如何通过/list-transactions显示交易信息的
作者:freewind 比原项目仓库: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom 在前一篇文章中,我们试图理解比原是如何交易的,但是由于内容太多,我们把它分成了几个小问题,并在前一篇解决了“在dashboard中如何提交交易信息”,以及“比原后台是如何操作的”。
1201 0
biostar handbook(五)|序列从何而来和质量控制
测序仪 2017年一篇发表在Nature的综述"DNA sequencing at 40: past, present and future"介绍了DNA测序这40年的发展历程。
1506 0