来自李明杰的视频。
block 用来保存一段代码
block 的标志:^
block 跟函数很像:
1).可以保存代码 2).有返回值 3). 有形参
temp1:没有返回值、没有形参的 block
如果 block 没有形参,可以省略 ()
void(^myblock)() = ^{ NSLog(@"----------"); NSLog(@"----------"); }; // 利用 block 变量调用 block 内部的代码 myblock();
temp2:有返回值,有形参
int (^sumblock)(int,int) = ^(int a,int b){ return a+b; }; //返回值 int c = sumblock(1,1); NSLog(@"%d",c);
temp 3:用一个 block 输出 n 条横线
void (^lineblock)(int) = ^(int n){ for (int i = 1; i < n; i++) { NSLog(@"-------"); } }; //无返回值,加 int 类型的参数 lineblock(5);
temp 4:
__block int a = 10; void (^block)(); block = ^{ /* block 内部可以访问外面的变量 默认情况下,block 内部不能修改外面的局部变量 给局部变量加上 __block 关键字,这个局部变量就可以在block内部修改 */ a = 20; NSLog(@"%d",a); }; block();
temp 5:使用 typedef 定义 block 类型
// 类型 + 变量 MyBlock sumBlock; sumBlock = ^(int a,int b){ return a+b; }; sumBlock(10,9); //减法 MyBlock minusBlock; minusBlock = ^(int a,int b){ return a - b; }; minusBlock(10,9); //乘法 MyBlock multipBlock; multipBlock = ^(int a,int b){ return a * b; }; multipBlock(10,9); //除法 MyBlock divideBlock; divideBlock = ^(int a,int b){ return a / b; }; divideBlock(10,2); NSLog(@"\n %d \n %d \n%d \n %d",sumBlock(10,9),minusBlock(10,9), multipBlock(10,9),divideBlock(10,2));
总结:
1.如何定义 block 变量
int (^sumBlock)(int,int); void (^myBlock)();
2.如何利用 block 封装代码
^(int a,int b){ return a - b; }; //没有参数 ^(){ NSLog(@"-----"); } //没有返回值 ^{ NSLog(@"-----"); }
3. block 访问外面变量
1.block 内部可以访问外面的变量 2.默认情况下,block 内部不能修改外面的局部变量3.给局部变量加上 __block 关键字,这个局部变量就可以在block内部修改
4.利用 typedef 定义 block 类型
typedef int(^MyBlock)(int,int); //以后就可以利用 MyBlock 这种类型来定义 block 变量 MyBlock block; MyBlock b1,b2; b1 = ^(int a,int b){ return a+b; }; MyBlock b3 = ^(int a,int b){ return a+b; };
时间: 2024-10-13 00:14:37