Block语法及页面传值

Block高级

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()
相关文章
相关标签/搜索