OC坑集之block作为函数参数

对于 OC(Objective-C,苹果推出的自家编程语言) 的争论一直不休,对于一门语言,我觉得只要能解决你的问题就够了。

评论一门编程语言的好坏之前,需要我们真正的去用它,OC 孰好孰坏,需要你自己去尝试。

OC 坑集,主要记载使用 OC 开发项目遇到的问题,尽量简洁明了,希望大家喜欢。

block 语句块可以作为函数的参数, 在项目中都经常被作为回调来使用。

如果你还不熟悉 block 语法,请自行 google,这里不讲 block 语法。我们下面直接进入主题。

创建一个 OC 类

1
2
3
4
5
6
7
#import <Foundation/Foundation.h>
@interface FoolBar : NSObject
- (void)makeFool:(void(^)(NSString *))callback;
@end
1
2
3
4
5
6
7
8
9
10
11
#import "FoolBar.h"
@implementation FoolBar
- (void)makeFool:(void (^)(NSString *))callback
{
NSLog(@"makeFool | callback.");
callback(@"This is a block parameter.");
}
@end

main.m

1
2
3
4
5
6
7
8
9
10
11
12
#import <Foundation/Foundation.h>
#import "FoolBar.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
FoolBar *fb = [[FoolBar alloc] init];
[fb makeFool:^(NSString *) {
}];
}
return 0;
}

大家看到这里,应该觉得没什么问题。

我刚开始也是行事冲冲的,但编译器给了个大大的 Error, 大致意思是参数丢失。

经过一番思想上面的斗争,终于解决了问题。

在声明带有 block 语句的方法时,需要带上参数名称或者调用者自己写上参数名称。

1
- (void)makeFool:(void(^)(NSString *param))callback;

重新给它整上,如下:

1
2
3
4
5
6
7
8
9
10
11
12
#import <Foundation/Foundation.h>
#import "FoolBar.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
FoolBar *fb = [[FoolBar alloc] init];
[fb makeFool:^(NSString *param) {
NSLog(@"param = %@", param);
}];
}
return 0;
}

使用 block 作为函数参数的时候,建议使用 typedef 定义 block.

1
typedef void (^OnFoolCallback)(NSString *name);

定义和实现

1
- (void)productFool:(OnFoolCallback)callback;
1
2
3
4
5
- (void)productFool:(OnFoolCallback)callback
{
NSLog(@"productFool | callback.");
callback(@"This is a block parameter: mark.");
}

测试和使用,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#import <Foundation/Foundation.h>
#import "FoolBar.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
FoolBar *fb = [[FoolBar alloc] init];
[fb makeFool:^(NSString *param) {
NSLog(@"param = %@", param);
}];
[fb productFool:^(NSString *name) {
NSLog(@"name = %@", name);
}];
}
return 0;
}

盼望疫情早日结束,每个人都能回归到正常的生活当中去!

坚持原创技术分享!