一.是么是Block
Block是一个C级别的语法以及运行时的一个特性,和标准C中的函数(函数指针)类似。block就是闭包,可以用来回调。
二.什么情况下使用Block
定义参数列表、返回类型外,还能够获取被定义时的词法范围内的状态(比如局部变量),并且在一定条件下(比如使用__block变量)能够修改这些状态
三.Block关键字
block 对外部变量只是可读的,如果要想可读可写就需要加上__Block
四.Block申明
五.传参Block
#import "ViewController.h"
typedef void (^MyBlock)(NSString *str);//typedef定义一个block
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
MyBlock tblock = ^(NSString *str) {
NSLog(@"-----%@", str);//1
};
[self testBlock:tblock];//2
}
- (void)testBlock:(MyBlock)mBlock
//如果开始没有用typedef定义的话,此处的函数变为- (void)testBlock:(void(^)(NSString *str))myblock
//简单的说格式就是 “返回值 + (^) + 参数 + 名字”
{
mBlock(@"1111");//3
}
在上面的代码中,我们写了一个testBlock的函数,将我们的tblock作为参数传到了testBlock函数里面,然后再testBlock里用mBlock调用了我们所写的MyBlock这个函数。
六.ios开发中,开了ARC模式,系统自动管理内存,如果程序中用到了block就要注意循环引用带来的内存泄露问题
某个类将block作为自己的属性变量,然后该类在block的方法体里面又使用了该类本身,简单说就是self.someBlock = ^(Type var){[self dosomething];或者self.otherVar = XXX;或者_otherVar = ...};block的这种循环引用会被编译器捕捉到并及时提醒
用__weak把self重新引用
__weak ViewController *weakSelf = self;
对于非ARC下, 为了防止循环引用, 我们使用__block来修饰在Block中使用的对象:
对于ARC下, 为了防止循环引用, 我们使用__weak来修饰在Block中使用的对象。原理就是:ARC中,Block中如果引用了__strong修饰符的自动变量,则相当于Block对该变量的引用计数+1。
对于ARC下, 为了防止循环引用, 我们使用__weak来修饰在Block中使用的对象。原理就是:ARC中,Block中如果引用了__strong修饰符的自动变量,则相当于Block对该变量的引用计数+1。