![【block作为函数的参数 Objective-C语言】,第1张 【block作为函数的参数 Objective-C语言】,第1张](/aiimages/%E3%80%90block%E4%BD%9C%E4%B8%BA%E5%87%BD%E6%95%B0%E7%9A%84%E5%8F%82%E6%95%B0+Objective-C%E8%AF%AD%E8%A8%80%E3%80%91.png)
一、block作为函数的参数
1.block是1个数据类型,能不能作为函数的参数呢,可以
2.例如,我有1个test函数,现在我要给它定义1个参数,定义1个block类型的参数,什么样的block呢,无参数、无返回值的block
main.m文件中
import
//为这个函数定义1个参数,定义1个block类型的参数
//无参数、无返回值的block
//如果要给它定义1个int类型的参数,就在小括号里面声明1个int类型的变量就可以了,例如void test(int num)
//如果要定义1个float类型的参数,就在小括号里面声明1个float类型的变量就可以了,例如void test(float f1)
//如果要定义1个block类型的参数,就在小括号里面声明1个block类型的变量就可以了,例如void test(void (^block1)())
void test(void (^block1)())
{
NSLog(@“--------------------”);
}
int main()
{
return 0;
}
这个时候,我是不是就在test()这个函数的小括号里面,声明了1个无参数、无返回值的block变量了啊,那么这个时候,这个block1就是这个test()函数的参数
这个参数block1是不是存储了代码啊,那么我就执行1下这个参数里的代码,如下:
void test(void (^block1)())
{
NSLog(@“--------------------”);
block1();
NSLog(@“--------------------”);
}
int main()
{
return 0;
}
3.如何为函数定义1个block类型的参数
1)在函数的小括弧里面,声明1个指定格式的block类型的变量就可以了
2)如果看见上面这个写法有点晕:
void test(void (^block1)()){
NSLog(@“----------------”);
block1();
NSLog(@“----------------”);
}
那就通过typedef把它弄成短格式就可以了
import
typedef void (^NewType)();
void test(NewType block1){
NSLog(@“----------------”);
block1();
NSLog(@“----------------”);
}
声明1个NewType类型的block1
那么这个block1是什么类型的呢
无返回值、无参数的block类型
3)可以使用typedef简化block的定义,这样看起来就不会恶心了,想吐了
4.如何去调用带block参数的函数呢
1)这样写是不行的:
#import
typedef void (^NewType)();
void test(NewType block1){
NSLog(@“--------------”);
block1();
NSLog(@“---------------”);
}
int main(){
test();
return 0;
}
这样写是不行的,因为这个test()函数,是不是有个参数啊,有参数就要传参啊
但是这个时候,我们这个函数的参数是个block
那我该怎么传呢
2)如果要调用的函数的参数是1个block 类型的,那么要求在调用的时候传入1个和形参block要求的代码段
第一步,在main.m文件中,先声明1个block类型的变量
int main(){
NewType type = ^void(){
NSLog(@“哈哈。。。”);
NSLog(@“呵呵。。。”);
NSLog(@“嘿嘿。。。”);
};
test(type);
return 0
}
输出:
----------------------
哈哈。。。
呵呵。。。
嘿嘿。。。
------------------------
3)上面这段代码怎么执行的,先执行main函数吧,从上往下执行,执行到第一句话:
NewType type = ^void(){
NSLog(@“哈哈。。。”);
NSLog(@“嘿嘿。。。”);
NSLog(@“呵呵。。。”);
};
在内存中开辟1块空间,命名为type ,这是1个block类型的变量,把下面的代码赋值给它:
NSLog(@“哈哈。。。”);
NSLog(@“嘿嘿。。。”);
NSLog(@“呵呵。。。”);
然后再执行这句话:
test(type);
执行test函数怎么执行的,第一步,加载函数,加载到代码段里,第二步,声明函数的参数,形参,在内存中开辟1块儿空间,就是这个block1,形参,第三步,传参,把实参传给形参,传参的本质是赋值,把实参的值赋值给形参,而现在实参是type,实参type的值是什么,是不是这段代码啊:
NSLog(@“哈哈。。。”);
NSLog(@“嘿嘿。。。”);
NSLog(@“呵呵。。。”);
好,把实参type的值,咔,赋给block1,这就是传参
第四步,执行函数体
打印1句:NSLog(@“----------------”);
执行参数block1里面的代码:block1();
而这个时候,参数block1里面的代码是什么啊,是不是下面这段代码啊:
NSLog(@“哈哈。。。”);
NSLog(@“嘿嘿。。。”);
NSLog(@“呵呵。。。”);
然后再打印这个波浪线:NSLog(@“-----------------”);
所以这就是,如何去调用带block参数的函数
10:09
评论列表(0条)