iOS Block 的简单介绍

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;

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

推荐阅读更多精彩内容