本文共 978 字,大约阅读时间需要 3 分钟。
*block 跟 swift 中的闭包(closure)基本一样,都常用于值的回调,使用起来极为方便.
*block 格式: 1)block 开头 是”^”,接着是由小括号包起来的参数列表,行为主体由大括号包起来. 2)block 有四种类型,分别是无参无返回值 无参有返回值 有参无返回值 有参有返回值,一般使用的block 一般都是有参block(使用block 主要目的就是参数的传递) *block 的循环引用问题 使用block 要注意类的循环引用,如一个控制器,self 强指针指向一个对象,而这个对象又强指针指向一个 block,而在block 中,又有强指针指向 self,从而造成循环引用,导致内存无法释放,造成内存泄漏*解决block 循环引用方法:
用 __weak 来打断强引用,例如,用__weak 来定义一个 weakSelf 来指向 self 的地址,如果 self 被释放,weakSelf 执行 nil,从而打断循环引用. 注意: __weak 是 ARC 专有的, __unsafe_unretained 可以用在 ARC 也可以用在 MRC,但 __unsafe_unretained 是”assign”形式,如果指向的对象被释放,其指针指向的地址保持不变,如果继续使用该指针,就会出现”野指针”.*block 内存管理
当block内部没有引用外部变量时,block存放在全局区;在运行时发现, block的本质是静态的static修饰的,所有全局可用, 这也是block可以跨类跨控制器调用的原因, 在MRC下,当block内部引用外部变量时,block存放在栈区;当对该栈区的block进行copy操作时,block将存放在堆区。在ARC下,当block内部引用外部变量时,block存放在堆区;关于堆区与栈区的区别,栈区主要存放局部变量,定义的参数等,在函数结束,系统会自动回收其内存空间,而堆区一般用程序员自行分配释放,若程序员不释放,程序结束时,由系统回收。总的来说,使用栈区更为快捷,而使用堆区更为灵活。Block的使用注意点:
如果要在block中修改外部变量,当变量是static全局变量时,block可以直接修改,如果不是,可以用__block关键字来修饰,就可以在block内修改变量的值。转载地址:http://ofwci.baihongyu.com/