iOS中block的简单内存分析

2016-03-23  本文已影响101人  蚂蚁牙齿不黑

block的声明与实现   形式如下  第一种形式

block的声明与实现

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

在block中访问外部变量

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

访问外部变量会报错

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

改变了内存地址

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

如果用__block修饰后  block内部会使用原先的那份内存  否则就会使用拷贝后的内存   原先的那块内存虽然值改变了  但并不影响内部拷贝后内存的值

一点一点扩展:

由此我们可以推测,如果block中使用的是指针,我们可以直接修改,如果不是的话需要用__block

block循环引用:

先来一个循环引用的案例 (编译器已经警告提示了,会造成内存泄漏)

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

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

上一篇下一篇

猜你喜欢

热点阅读