创建block的语法。
typedef "返回值类型" (^blockName)(Param1,Param2);
如果没有返回值,则是
typedef void (^blockName)(Param1,Param2);
如果没有参数,则是
typedef void (^blockName)(void);
block访问
block体内访问局部变量,需要加__block关键字,等效于全局变量和静态变量。如果不加
__block关键字,则是copy变量的值
block访问static修饰的变量时,直接读取变量的最新值,而不是在block声明时候的值
为防止循环引用,需要在block引用对象变量的时候加入以下代码
__weak typeof(self) weakSelf=self;
然后早block体里面用weakSelf来访问self里面的属性
block的分类
根据block在内存中位置可以分为三类:NSGloabBlock,NSStackBlock,NSMallocBlock
第一种,不需要在运行时改变行为的block,不需要放在堆或栈上,一个很简单的判别方法就是,是否引用外部变量
第二种,block是在栈上生成的,离开栈的作用域,block就无效了。在MRC环境下,需要手动的进行copy才能脱离栈使用。在ARC下,编译器自动进行copy操作
第三种,block是在堆上生成的,在第二种,copy过之后的block其实就是位于堆上,即变成了NSMallocBlock