简介
Block本质上是指向一个结构体的指针。Block可以形象的比作一个函数体。使用代Block你可以像调用其他标准函数一样,传入参数数,并得到返回值。但是它远比函数更加强大。
循环引用
1.如果没有对block进行copy操作,block就存储于栈空间
2.如果对block进行copy操作,block就存储于堆空间
3.如果block存储于栈空间,不会对block内部所用到的对象产生强引用
4.如果block存储于堆空间,就会对block内部所用到的对象产生强引用
当block中的对象被强引用时,导致循环引用,内存无法释放
解决方法:使用__weak 指向对象
1 | Person *p = [[Person alloc] init]; |
定义
1 | 返回值类型(^block变量名)(形参列表) = ^(形参列表) { |
简单用法
1.无参数无返回值的Block
1 | /** |
2.有参数无返回值的Block
1 | /** |
3.有参数有返回值的Block
1 | /** |
界面传值
在项目开发中,会遇见在B控制器完成输入操作之后返回到A控制器,同时需要拿到B控制器的数据。这种情况可以使用代理,通知,Block解决。本文以Block方式来举例。
B控制器
.h文件
1 | // 定义一个名为TextBlock的Block |
.m文件
1 | // 当view即将消失时,调用block |
A控制器
1 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender |
逻辑整理:在A控制器中事先定义好需要在B控制器执行的操作,然后B在恰当的时机进行调用。