【block作为函数的参数 Objective-C语言】

【block作为函数的参数 Objective-C语言】,第1张

一、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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/2889614.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-14
下一篇 2022-09-14

发表评论

登录后才能评论

评论列表(0条)

保存