Block用法
2019-02-28 本文已影响19人
陌巷先森
概述
block:苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性。
匿名函数:没有函数名的函数,一对{}包裹的内容是匿名函数的作用域。
block语法
- block变量声明: 返回值类型(^block变量名)(参数列表);
//声明一个无返回值,有两个int类型参数的,叫做blk的block
void(^blk)(int a, int b);
- block表达式语法:^返回值类型(参数列表){表达式};
//无参数无返回值的block表达式
^void(void){
NSLog(@"这是block块");
};
- block变量赋值: 返回值类型(^block变量名)(形参类型) =^(形参列表){表达式};
//定义了一个返回值为int型,有两个int类型参数的,叫做add的block。表达式内将两个int参数相加,并将结果返回
int(^add)(int,int) = ^(int a,int b) {
int c = a+b;
return c;
};
int result = add(5,4);
NSLog(@"result----%d",result);
使用typedef简写格式为:typedef 返回值类型(^block变量名)(形参列表)
//用typedef定义一个block
typedef int(^ADD)(int,int);
// ADD就变为了一种Block类型,可以像声明变量一样来声明ADD
ADD add_k = ^(int a,int b) {
int c = a+b;
return c;
};
int result_k = add_k(4,2);
NSLog(@"result_k----%d",result_k);
block与外界变量
截获自动变量值
对于 block 外的变量引用,block 默认是将其复制到其数据结构中来实现访问的。也就是说block的自动变量截获只针对block内部使用的自动变量, 不使用则不截获, 因为截获的自动变量会存储于block的结构体内部, 会导致block体积变大。特别要注意的是默认情况下block只能访问不能修改局部变量的值。
int a = 10;
void(^blk)(void) = ^(void) {
NSLog(@"block内部a----%d",a);
};
a = 15;//Block外修改a,不影响block内的自动变量
blk();//block内部a----10
NSLog(@"a----%d", a);//a----15
__block 修饰的外部变量
对于用__block
修饰的外部变量引用,block 是复制其引用地址来实现访问的。block可以修改__block
修饰的外部变量的值。
__block int a = 10;a为__block变量,可在block中重新赋值
void(^blk)(void) = ^(void) {
NSLog(@"block内部a----%d",a);
};
a = 15;
blk();//block内部a----15
NSLog(@"a----%d", a);//a----15
防止block循环引用
对block内要使用的对象A使用__weak
进行修饰,block对对象A弱引用打破循环。
__weak typeof(self) weakSelf = self;
self.blk = ^{
NSLog(@"In Block : %@",weakSelf);
};
参考:完整项目资料下载