Block语法及页面传值

Block高级

Block:块语法,本质上是匿名函数,标准的C里面是没有Block的,C语言的后期扩展版本加入了匿名函数

Block语法:

int(^myBlock)(int) = ^(int a){ return a;};

myBlock是block变量,^符号是将myBlock声明为一个块对象 int(^)(int)是myBlock的类型。 ^(int a){return a;};是Block值

Block进行typedef

typedef int(^BlockType)(int a,int b)

原类型:int(^)(int a,int b)

新类型: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()


你可能感兴趣的:(ios,block,页面传值)