Block
Block:带有自动变量(局部变量)的匿名函数
在Block语法表达式中将赋值给在Block语法外声明的自动变量,需要在该自动变量上附加__block说明符。
Blocks中截获自动变量的方法并没有实现对C语言中数组的截获,所以需要有指针代替
3种Block对象类型
Block也是Objective-C的对象,所以它有相应的类,根据Block存储区域划分有3种Block
NSConcreteGlobalBlock,全局的静态Block,不会访问任何外部变量。
NSConcreteStackBlock,保存在栈中的Block,当函数返回时会被销毁。(ARC状态下没有)
NSConcreteMallocBlock,保存在堆中的Block,当引用计数为0时会被销毁。
在ARC开启的情况下,将会只有NSConcreteGlobal和NSConcreteMallocBlock类型的block。由于ARC已经能很好的处理对象的声明周期的管理,这样所有对象都放到堆上管理,对于编译器实现来说,会比较方便。
避免循环引用:使用__weak可以让Block无法持有实例,从而避免了循环引用。另外,为了方式在Block执行半途时实例被释放,通常在Block方法块中先创建一个__strong的实例指针对其进行持有,当Block方法块结束后,strongSelf就会被释放
网友评论