------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1 block的使用方法
块的语法格式如下:
^ [块返回值类型] (形参1,形参2,...)
{
}
块必须以^开头,返回值类型通常都被省略,如果没有形参,建议使用void作为占位符。
如果程序需要多次调用已经定义的块,那么应该將块赋值给一个块变量,定义块变量的语法格式如下
块返回值类型 (^块变量名) (形参类型1,形参类型2,...);
定义块变量时,不需要声明形参名,只需要指定形参类型。类似的,如果块变量不需要形参,建议使用void作为占位符。
//main.c int main() { // 如果block没有形参,可以省略后面的(),块变量后面的()不能省略 void (^myblock)() = ^{ NSLog(@"----------------"); NSLog(@"----------------"); }; // 利用block变量调用block内部的代码 myblock(); // 有返回值、有形参的block int (^sumblock)(int, int) = ^(int a, int b){ return a + b; }; int c = sumblock(1,2); return 0; }
2 block与局部变量
块可以访问局部变量的值,当块访问局部变量的值时,不允许修改局部变量的值。给局部变量加上__block关键字,这个局部变量就可以在block内部修改。
//main.c int main() { int a = 10; __block int b = 20; void (^block)(); block = ^{ // block内部可以访问外面的变量 NSLog(@"a = %d", a); // 默认情况下,block内部不能修改外面的局部变量 // a = 20; // 给局部变量加上__block关键字,这个局部变量就可以在block内部修改 b = 25; NSLog(@"b = %d", b); }; block(); return 0; }
3 掌握block的知识点
Block 是iOS在4.0之后新增的程式语法,
1、用法:用来保存一段代码
2、标志:^
3、block跟函数很像:
1)可以保存代码
2)有返回值
3)有形参
4)调用方式一样
4 如何定义block变量
//int为返回值,参数为两个int类型的sumBlock的 block int (^sumBlock)(int, int); //无返回,无参数的myBlock的 block代码 void (^myBlock)();
5 如何利用block封装代码
//1)带有两个int类型的参数a、b ^(int a, int b) { return a - b; }; //2)无参的代码形式,无参括号可以省略 ^() { NSLog(@"----------"); }; //无参括号可以省略 ^ { NSLog(@"----------"); };
6 利用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; };
7 代码示例(重点掌握block对方法块的封装,增强代码可读性)
#import <Foundation/Foundation.h> //利用typedef定义block类型,以后就可以利用MyBlock这种类型来定义block变量 typedef int (^MyBlock)(int, int); int main(){ //定义一个MyBlock类型的sumBlock MyBlock sumBlock; //sumBlock代码块的实现,加法返回a+b的值 sumBlock = ^(int a, int b) { return a + b; }; //同理实现减法 MyBlock minusBlock = ^(int a, int b) { return a - b; }; //同理实现乘法 MyBlock multiplyBlock = ^(int a, int b) { return a * b; }; //使用代码块,打印输出 NSLog(@"%d - %d - %d", multiplyBlock(2, 4), sumBlock(10 , 9), minusBlock(10, 8)); return 0; }
Block 封装了一段代码,可以在任何时候执行
Block可以作为函数参数或者函数的返回值,而起本身又可以带输入参数或返回值
多用于 多线程、异步任务、集合遍历、集合排序、动画转场等
block总结:
1.>定义block变量:
int (^sumBlock)(int ,int);
void (^myBlock)();
2.>利用block封装代码
^(int a,int b){
return a - b;
}
^{
NSLog(@"");
}
3.>block访问外部变量
block 内部可以访问外面的变量
默认情况下,block内部变量不能修改外面的局部
给局部变量加上__block关键字,这个局部变量就可以在block内部修改
4.>利用typedef定义block类型
typedef int (^MyBlock)(int,int);
test3:利用typedef 简化声明定义block
typedef int (*SumP)(int,int); typedef int (^MyBlock)(int,int); int sum(int a,int b){ return a+b; } void test4(){ SumP p = sum; SumP p2 = sum; MyBLock = sumBlock; sumBlock = ^(int a,int b){ return a+b; }; MyBlock = minusBlock(^int a,int b){ return a-b; }; NSLog(@"%d - %d",sumBlock(10,9),minusBlock(10,5)); }
test3:block修改外部的变量
void test3(){ int a = 10; __block int b = 20; void (^block)(); block=^{ //block 内部可以访问外面的变量 NSLog(@"a = %d",a); //默认情况下,block内部变量不能修改外面的局部 a = 20;//这是不可以的 //给局部变量加上__block关键字,这个局部变量就可以在block内部修改 b = 25; }; block(); }
test2:有返回值,有形参的block
void test(){ int (*sumpoint)(int,int) = sum; //可以对比一下 int d = p(10,13); int (^sumblock)(int,int)=^(int a,int b){ return a+b; } int c = sumblock(10,11); NSLog(@"%d",c); void (^lineBlock)(int) = ^(int n){ for(int i=0;i<n;i++){ NSLog(@"----------------"); } }; lineBlock(5);//输出五条线 return 0; }
//test1:没有返回值,没有形参的block
void test1(){ //block 用来保存一段代码 //block的标志: ^ /* block跟函数很像: 1.可以保存代码 2.有返回值 3.有形参 4.调用方式一样 */ //定义block变量 void (^myblock)() = ^{ /^() 可以省略括号 NSLog(@"----------"); NSLog(@"----------"); }; //利用block变量调用block内部的代码 myblock(); //int a = 10;相似 return 0; }
黑马程序员--OC Bolck笔记
最新推荐文章于 2020-05-20 15:46:18 发布