【block的基本使用 Objective-C语言】

一、如何去声明1个block变量、如何往block变量里面存储1段代码

二、block变量的声明

1、block是1个数据类型,可以声明1个block变量,那么怎么声明block变量呢

2.虽然block变量中是用来存储1段代码的,但是1个block变量中,并不是任意的1段代码都可以存进去,而是有限定的,主要是限定这段代码有没有参数,有没有返回值

也就是说,在声明block变量的时候,必须要指定这个block变量存储的代码段,有没有参数,有没有返回值,什么类型的返回值,什么类型的参数

一旦指定以后,这个block变量中就只能存储这样的代码了

例如:

声明了1个block变量,指定返回值是void,参数是1个int类型的,这个时候,这个block变量当中就只能存储无返回值并且有1个int参数的代码段

3.声明block变量的语法格式:

返回值类型 (^block变量的名称)(参数列表);

void (^myBlock1)();

表示声明了1个block类型的变量,名字叫做myBlock1,这个变量中只能存储没有返回值,没有参数的1段代码

int (^myBlock2)();

表示声明了1个block类型的变量,名字叫做myBlock2,这个变量中只能存储返回值为int,无参数的1段代码

int (^myBlock3)(int num1,int num2);

代表声明了1个block类型的变量,名字叫做myBlock3,这个变量中只能存储返回值为int,有两个整型的参数的代码段

4.最重要的:

声明block变量的时候要指定这个block变量可以存储的代码段的返回值和参数描述

一旦指定,这个block变量中就只能存储这样的代码段了,其他格式的代码段无法存储

三.初始化block变量

1.原理:写1个符合block变量要求的代码段,存储到这个block变量中就可以了

2.代码段的书写格式

^返回值类型(参数列表){

代码段;

};

3.写1个无参数、无返回值的代码段:

^void(){

NSLog(@“大家好。”);

NSLog(@“我是人。”);

};

4.怎么将上面的1段代码存储到myBlock1里面去,赋值就可以了

myBlock1 =

^void(){

NSLog(@“大家好。”);

NSLog(@“我是人。”);

};

5.这个时候,我们就可以将这段代码使用赋值符号存储到无返回值、无参数要求的block变量当中

void (^myBlock1)();

myBlock1 = ^void(){

NSLog(@“大家好。”);

NSLog(@“我是人。”);

};

6.也可以在声明block变量的同时,使用符合要求的代码段初始化:

void (^myBlock1)() =

^void(){

NSLog(@“大家好。”);

NSLog(@“我是人。”);

};

四、写1个有返回值的代码段:

1.格式是固定的:

^返回值类型 (参数列表){

代码段;

};

2.先写个尖尖 ^ ,前面咱们说过,这个叫异或,是C语言里面的运算符

再写1个返回值类型,^int

有没有参数呢,没有参数, ^int()

再写1对大括号,^int(){

};

再写代码段, ^int(){

int num1 = 10 + 20 ;

};

这段代码有返回值的哦,什么类型的返回值,是不int 类型的啊,所以需要return 1个返回值

^int(){

int num1 = 10+20;

return num1;

};

3.你这个代码段,是不刚好符合myBlock2的要求啊,

int (^myBlock2)();

myBlock2要求是返回值类型是int类型,参数是无参,那我们是不可以把这个代码段复制给myBlock2变量啊

int (^myBlock2)() = ^int(){

int num1 = 10+20;

return num1;

};

你看这个时候,myBlock2里面是不就存储了这么1段代码了:

^int(){

int num1 = 10+20;

retune num1;

};

4.我们就可以将这段代码赋值给符合要求的block变量

int (^myBlock2)() = ^int(){

int num1 = 10+20;

return num1;

};

五、既有返回值,又有参数的代码段

1.先写1个尖尖 , ^

2.返回值是int类型的, ^int

3.有几个参数,两个,都是int类型的, ^int(int num1,int num2)

4.再写1对大括号, ^int(int num1,int num2){

};

5.再写代码段, ^int(int num1,int num2){

int num3 = num1+num2;

return num3;

};

6.这段代码是不刚好和myBlock3的要求是一样的啊: int (^myBlock3)(int num1,int num2);

7.我是不可以把这段代码,直接赋值给myBlock3啊

int (^myBlock3)(int num1,int num2) = ^int(int num1,int num2){

int num3 = num1 + num2;

return num3;

};

8.这个时候,myBlock3里面就存储了这段代码

9.我们刚刚说过,myBlock3有什么样的要求,它只能存储返回值类型是int类型,有两个整型的参数的代码段,我给它赋值的这段代码,是不刚好是符合这个要求的啊

10.所以,我们可以将这段代码赋值给符合要求的block变量

int (^myBlock3)(int num1,int num2) = ^int(int num1,int num2){

int num3 = num1+num2;

return num3;

};

六、注意:

1.万一我给它赋个不符合要求的代码段呢

直接报错

2.赋值给block变量的代码段,必须要符合block变量的要求,否则就会报错

七、如何执行存储在block变量中的代码

1.语法格式:

block变量名();

2.例如,我要去执行存储在myBlock1变量当中的代码:

void(^myBlock1)() = ^void(){

NSLog(@“大家好。”);

NSLog(@"我是人。 ");

};

只需要写上

myBlock1();

即可

这个时候,就回去执行存储在myBlock1当中的代码段

输出,大家好。我是人

3.想要去执行myBlock2中的代码,它有1个返回值,只需

myBlock2();

这个block变量里面存储的代码段,是不有个返回值啊,我想拿到返回值怎么办呢,用1个变量接收,不就可以吗

int sum = myBlock2();

NSLog(@“sum = %d”,sum);

输出:sum = 30

4.想要去执行存储在myBlock3中的代码段,它既有参数又有返回值

myBlock3(),是不有参数啊,是不两个整型参数啊,给呗

myBlock3(10,100);

是不有返回值啊,接呗

int res = myBlock3(10,100);

NSLog(@“res = %d”,res);

输出:res = 110

总结:

1.语法格式:block变量名();

2.有参数就传参,有返回值就接

猜你喜欢

转载自blog.csdn.net/madoca/article/details/126754507