OC坑集: block作为函数参数

对于 OC 的争论一直不休, 对于一门语言,  我觉得只要能解决你的问题就够了.

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

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


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

如果你还不熟悉 block 语法, 请自行 google.

这里不讲 block 语法.


创建一个 OC 类

#import 

@interface FoolBar : NSObject

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

@end

实现如下

#import "FoolBar.h"

@implementation FoolBar

- (void)makeFool:(void (^)(NSString *))callback
{
    NSLog(@"makeFool | callback.");
    callback(@"This is a block parameter.");
}

@end

在 main.m 里面调用

#import 
#import "FoolBar.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        FoolBar *fb = [[FoolBar alloc] init];
        [fb makeFool:^(NSString *) {
            
        }];
    }
    return 0;
}

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

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


经过一番挣扎, 终于解决了问题.

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

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

重新调用

#import 
#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.

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

定义和实现

- (void)productFool:(OnFoolCallback)callback;

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

测试和使用

#import 
#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;
}


你可能感兴趣的:(iOS)