对于 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;
}
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;
}