ARC中block块作为属性的使用笔记

block较难理解,根据在内存中的分布情况就分为3种类型,根据使用的情形又分为很多很多种。虽然用起来容易,但使用不当会造成内存泄露,虽然都是这么说,但你真的研究过为什么会泄露吗?为什么有些时候外部变量进入block的时候会导致引用计数+1呢?

本人做过MRC以及ARC的开发,但大势所趋,ARC将是以后开发的主要模式,即使有MRC也是ARC混编MRC的代码,所以,本文的block的一些使用上的心得都基于ARC的,已经不考虑MRC的了,请看官注意,MRC与ARC的block是有着很多很多区别的。

注意,以下心得是我自己长时间收集资料以及自己验证所的出来的一些技巧与结论,不代表它的正确性,这仅仅是笔记,取舍由你决定,最好自己验证一下。

首先建立出如下形式的工程,CV1 push 到CV2的这种形式。

它们的强引用关系如下:

以下是CV2的代码,注意,要将block定义成copy属性。

block被copy了有着什么现象发生呢?引用一段原文。

http://stackoverflow.com/questions/16149653/what-is-the-role-of-the-copy-in-the-arc

Blocks are similar to other objects for memory management, but not the same. When a block which accesses local variables is created, it is created on the stack. This means that it is only valid as long as its scope exists. To save this block for later, you must copy it, which copies it to the heap.

Blocks与其他对象的内存管理相似,但又有着不同。当一个block(block当中有着外部变量进入)被创建了,它是在堆区中的。那意味着,当block中的代码执行完毕之后,这段代码就再也不合法了,会被清除掉。为了让这个block存活时间更久。你必须copy,将它拷贝到栈区。

1. CV1 push 到CV2,CV2在栈区里面,CV2 pop 掉后整个控制器都被释放。

2. 作为属性的block被copy之后会出现在CV2栈区里面,为什么在栈区里面,很简单,它要随着CV2的生命周期一致,CV2 pop 掉后这个block也会跟着一起消失的。

他们的强引用关系如下图所示:

以下情形叫做有外部变量进入block的情形,其中的self.name就是控制器CV2的一个属性,对于block来讲属于外部变量。

这里有一个问题,对于进入到block里面的外部变量,为什么会被block强引用呢?

我们可以这么想,block块中的代码并不是马上就会执行的,需要你手动调用才行,如上例中的self.oneBlock(@“YouXianMing”);有时候,这个方法都执行结束了,这个block还没有执行,如果block中的对象没有被block强引用,很有可能那个变量已经消失了却还调用了block,直接后果就是崩溃。为了保证block至少能用上一次,它必须强引用进入到里面的外部变量。

所以上图中的强引用关系图如下所示:

如果CV2 pop 了,其释放过程是这样子的:

CV2被CV1强引用消失,CV2就会挨个检查强引用,如果没有发现自己被什么强引用,就会把所有的内容清除掉,就是上图中的oneBlock以及name。

最后,之后轮到oneBlock了,它也会解除name的强引用关系:

至此,都是很完美的,没有内存泄露什么的。

我们把代码修改成如下的形式,我们在block中执行一个方法,让控制器执行一个方法,即[self ......];

它们的强引用关系图如下,注意下图中的蓝色的线条,因为外部变量self(CV2自身)传了进来,只出现的self也算传进来了哦。

这个时候,你如果将 CV2 pop掉。它们的关系图如下所示:

这个时候,CV2会检测自己有没有被强引用,结果发现被一个对象oneBlock强引用了,那么它自身就不会被释放掉,整个CV2都泄露了呢,泄露的原因就是循环引用。

这时候,你再从CV1 push 出CV2,以下是关系图:

再次pop又会泄露一个CV2。每次的push与pop都会导致一个新的CV2整体被泄露哦。

这还只是作为属性的block。其他的还没讲呢。作为属性的block是最容易出现循环引用事件的。block的知识都比较隐晦,你以为你懂了,其实你没懂。需要抱着一颗不浮躁的心,慢慢的分析它的特性,写代码验证自己的想法,然后才会使用得得心应手。

ARC中block块作为属性的使用笔记相关推荐

  1. 浅析ios开发中Block块语法的妙用

    事实上,任何一个应用的开发都离不开多线程.而"块"block与GCD就是苹果OC语言中多线程的核心.      一.块的内部结构      在oc中,块语法以闭包的形式存在,每一个 ...

  2. 加载顺序_JAVA类代码块和属性的加载顺序问题,不要以为静态块始终最先执行了!...

    类代码块和属性的加载顺序问题,不要以为静态块始终最先执行了! 我们知道在一个类中,类的加载顺序为 静态代码块-->普通代码块-->构造代码块,感觉静态块始终是最先初始化的,其实并不是,下面 ...

  3. Objective-C中的block块语法

    #import <Foundation/Foundation.h>/*OC不同于Java C++ 它没有字符串对象 只有NS对象NS就是乔布斯第一个公司NeXt的类集合 被收购之后才有了C ...

  4. css规则中区块block,css常用属性总结:背景background下篇

    前言:这段时间天天加班到10:30之后,简直是x了. 在上一篇文章中,分别解析了background各个属性的用法和注意细节.如果我们在项目上使用背景效果,如果使用下面的写法,你可能抓狂. body{ ...

  5. 使用C#中的AutoCAD .NET API对CAD二次开发,获取块的属性

    使用C#中的AutoCAD .NET API对CAD二次开发,获取块的属性 /// <summary> /// 获得块对象的所有属性 /// </summary> public ...

  6. ARC中的三个关键字

    ARC中,变量可以用三个关键字修饰: __strong: 赋值给这个变量的对象会自动被retain一次,如果在block中引用它,block也会retain它一次. __unsafe_unretain ...

  7. oc中block的本质及底层原理

    block的本质 block的种类及储存区域 __block的本质 block的循环引用 前言: 这里就不讨论block的具体写法及使用场景了,因为当你有一天想深入了解block 的底层原理时,你早已 ...

  8. DIV CSS display (block none inline)属性的用法教程

    在一般的CSS布局制作时候,我们常常会用到display对应值有block.none.inline这三个值.下面我们来分别来认识和学习什么时候用什么值.这里通过CSS display知识加实例.图演示 ...

  9. Objective-C中block的底层原理

    先出2个考题: 1. 上面打印的是几,captureNum2 出去作用域后是否被销毁?为什么? 同样类型的题目: 问:打印的数字为多少? 有人会回答:mutArray是captureObject方法的 ...

最新文章

  1. Gym 101845(2018 ACM-ICPC, Universidad Nacional de Colombia Programming Contest)
  2. PowerPC VxWorks BSP分析7——image压缩
  3. bloc+rxdart解决代码混乱大问题
  4. 离群点检测算法——LOF(Local Outlier Factor)
  5. 【杂谈】追着光、靠近光、成为光、散发光
  6. pixhawk博客导读
  7. XJOJ - 路径数(最短路+最短路路径数量)
  8. 进程间关系和守护进程
  9. 基于Ajax的应用程序架构汇总(三)
  10. 3分钟了解ServiceStage 应用智能化运维【华为云分享】
  11. 2017.4.16 麦森数 思考记录
  12. jQuery UI.Layout
  13. 中通科技移动自动化测试的革新与探索
  14. 我新买的GTX1050为何装上去一直是黑屏
  15. Bruce的程序员语录
  16. P6800 - 刷入CWM
  17. wamp 增加php 7.2,笔记 : WampServe加装PHP版本(7.2.3)为例
  18. 网页显示mysql数据库到表格数据_html表格显示数据库数据
  19. 云南昆明寺庙方丈还俗完婚 迎娶26岁女老板(图)
  20. python设置散点图点的大小_python_matplotlib分别使用plot()和scatter()画散点图,以及如何改变点的大小...

热门文章

  1. mysql图片路径varchar大小_Mysqlvarchar大小长度问题_MySQL
  2. css 科技 边框_CSS 边框
  3. 【AI学院】新手如何学CV?老司机带学有三书籍《深度学习之图像识别》,赠书8本...
  4. 【NLP机器学习基础】从线性回归和Logistic回归开始
  5. 【模型解读】历数GAN的5大基本结构
  6. 安卓工程版本控制哪些文件可以忽略
  7. UpdateLayeredWindow 绘制异型窗口
  8. 微信小程序 没有找到可以构建的npm包
  9. django时差8个小时问题
  10. C/C++获取系统当前时间