iOS内存泄露

iOS Block 的简单介绍

2016-04-27  本文已影响61人  青葱烈马

Block 的定义:

@property (nonatomic,copy)void(^myBlock)(int age);

Block 定义中copy关键字的使用:

1>使用 copy 关键字是把 block 拷贝到堆中,而栈中的 block 的生命周期是和栈绑定的. 使用 copy 是有可能在 block 代码块里面是用到一些本地变量.

2>如果使用 copy属性,当其所在栈被释放的时候,这些本地变量将变得不可访问,一旦代码执行到block这段就会导致bad access;

3>在一个 block 中使用本地变量,如果声名用assign,代码执行到block内部就会出错.

4>在 Objective-C 语言中,一共有 3 种类型的 block:

         _NSConcreteGlobalBlock 全局的静态 block,不会访问任何外部变量。

         _NSConcreteStackBlock 保存在栈中的 block,当函数返回时会被销毁。   

         _NSConcreteMallocBlock 保存在堆中的 block,当引用计数为 0 时会被销毁。

5>在 block 中对于外部变量的应用:

         默认情况下,block 是将外部变量 copy 到其数据结构中来实现访问的,

         使用__block 修饰外部变量引用,block 是复制其引用地址来实现访问的.

block循环引用问题:

形成原因:

block引起的内存泄露问题,一般是由于在 block 中使用 self , self 持有当前对象, 当前对象持有 block, block 持有 self.  造成循环引用, 

解决办法:

把 block 引用的 self 修饰为弱引用.

__weak viewController* blockSelf = self;

上一篇下一篇

猜你喜欢

热点阅读