Block分类
block定义的格式为: 返回值类型+block名+参数
以下是无参数定义
void(^BlockName)(void)
以下是有参数定义
void(^BlockName)(void)
block的回调实现格式为:^+返回参数+{}实现
有参数实现
^(int i,NSString *s){
NSLog(@"%d %@",i,s);
}
无参数实现
^{
NSLog(@"123");
}
block有三种类型:NSGlobalBlock全局区区,NSMallocBlock堆区,NSStackBlock栈区
看如下代码打印结果
void(^block)(void) = ^{
};
block();
NSLog(@"%@",block);
2019-07-27 18:06:51.412115+0800 Block学习[2910:612197] <NSGlobalBlock: 0x100850088>
此时,block里面什么也没有做,block的类型为NSGlobalBlock,下面,我们在函数体里添点料
__block int a = 10;
void(^block)(void) = ^{
a++;
};
block();
NSLog(@"%@",block);
2019-07-27 18:10:21.510121+0800 Block学习[2954:622388] <NSMallocBlock: 0x600001f7e550>
这个时候打印的block类型变了,说明了什么?这就是block自动捕获变量,从而将对象从全局区copy到堆区。
再看一种情况,直接打印block
NSLog(@"%@",^{
a++;
});
2019-07-27 18:17:49.176216+0800 Block学习[3028:642942] <NSStackBlock: 0x7ffeef5bf880>
这就是最后一种类型,直接实现函数体。
网友评论