Block:块语法,本质上是匿名函数,标准的C里面是没有Block的,C语言的后期扩展版本加入了匿名函数web
Block语法:数组
int(^myBlock)(int) = ^(int a){ return a;};函数
myBlock是block变量,^符号是将myBlock声明为一个块对象 int(^)(int)是myBlock的类型。 ^(int a){return a;};是Block值spa
Block进行typedef代理
typedef int(^BlockType)(int a,int b)指针
原类型:int(^)(int a,int b)code
新类型:BlockType对象
采用新类型声明Block变量排序
BlockType block = ^(int a,int b){ return a+b;};Block访问外部变量内存
Block能够访问和修改全局变量,可是只能访问局部变量不能修改局部变量,若要修改局部变量要对局部变量外加__block修饰。
Block的应用
(1)使用block进行数组排序
(2)实现函数回调功能(即调用)
(3)用于页面之间的通讯,同时能够传值
block页面传值的好处:不用设置代理,取代了代理的做用
简单叙述页面传值的步骤
在第二个页面声明block变量,当第一个页面跳转至第二个页面时,创 建第二个页面后也给第二个页面的block变量赋值(块内部实现可将第 二个页面的值传至第一个页面),而后在第二个页面回调改函数Block的内存问题
定义属性接受Block,必须使用copy修饰,retain和assign会形成野指针的问题。由于Block在某个方法中定义时存储在了栈区,在另外一个类中使用时要建立是存储在堆区因此应该使用copy修饰。 在block的实现部分,不能直接食用实例变量,self调用属性,由于block会形成self引用计数加1,致使循环引用问题。 MRC写法:__block typeof(self) BlockSelf = self; ARC写法:__weak typeof(self) WeakSelf = self; 在dealloc中要使用对应的Block_release()