iOS中block的简单内存分析

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

block的声明与实现

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


在block中访问外部变量

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


访问外部变量会报错

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


改变了内存地址

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


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

一点一点扩展:

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


block循环引用:

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

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


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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容