天天看点

iOS - OC Block 代码块前言1、Block 的使用2、Block 的回调3、Block 属性定义中为什么使用 copy 修饰4、循环引用

Block 是一段预先准备好的代码,可以在需要的时候执行,可以当作参数传递。Block 可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。Block 是 C 语言的,类似于一个匿名函数,它和传统的函数指针很类似,但是 Block 是 inline(内联函数)的,并且默认情况下它对局部变量是只读的。

苹果官方建议尽量多用 Block。在多线程、异步任务、集合遍历、集合排序、动画转场用的很多。

Block 语法

Block 的简单定义

Block 数据类型的定义

Block 可以访问局部变量,但是不能修改,如果要修改需加关键字 __block(双下划线)。

ARC 开发的时候,编译器底层对 block 做过一些优化,使用 copy 修饰可以防止出现内存泄漏。

从内存管理的角度而言,程序员需要管理的内存只有堆区的。如果用 strong 修饰,相当于强引用了一个栈区的变量。

而使用 copy 修饰,在设置数值的时候,可以把局部变量从栈区复制到堆区。

在 Block 中调用 self 容易产生循环引用,无法释放对象,在程序中可以使用析构方法判断是否产生了循环引用。

可以使用关键字 __weak 声明一个弱变量,或者为属性指定 weak 特性。如:

继续阅读