iOS中block的简单内存分析
2016-03-23 本文已影响101人
蚂蚁牙齿不黑
block的声明与实现 形式如下 第一种形式

第二种形式 先定义个block类型,大多数情况下也采用这种形式

在block中访问外部变量
如果你在一个block块中仅仅访问对象,而不是对他进行修改操作,是没有任何问题的,但是修改的话就会报错

根据猜测,在block生成的同时会对内部使用的变量copy一份,可通过打印变量地址得道验证

如果要在block内部使用外部变量,需要在变量前用__block来修饰,那么__block做了什么?通过如下代码不难发现__block只做了一件事

如果用__block修饰后 block内部会使用原先的那份内存 否则就会使用拷贝后的内存 原先的那块内存虽然值改变了 但并不影响内部拷贝后内存的值
一点一点扩展:
由此我们可以推测,如果block中使用的是指针,我们可以直接修改,如果不是的话需要用__block
block循环引用:
先来一个循环引用的案例 (编译器已经警告提示了,会造成内存泄漏)

而下面这段代码就不会有警告

因为self并为对GCD的这段block代码产生强引用