OC坑集: block作为函数参数

来源:互联网 发布:动画软件flash下载 编辑:程序博客网 时间:2024/05/16 15:00

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

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

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


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

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

这里不讲 block 语法.


创建一个 OC 类

#import <Foundation/Foundation.h>@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 <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 语句的方法时, 需要带上参数名称或者调用者自己写上参数名称.

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

重新调用

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

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

定义和实现

- (void)productFool:(OnFoolCallback)callback;

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

测试和使用

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


2 0
原创粉丝点击