方法调用相信大家都已经在熟悉不过了, 比如以下代码:.h
@interface Person : NSObject- (void)run;
@end
.m
@implementation Person- (void)run {NSLog(@"run");
}@end
调用
Person *p = [Person new];
[p run];
或者 p.run;
相信你刚刚接触OC的时候, 就已经透彻理解这些东西了, 当你学习完Block后, 你可能还这么写过:.h
@interface Person : NSObject- (void)run:(void(^)())runClick;
@end
.m
@implementation Person- (void)run:(void(^)())runClick {
runClick();
}@end
调用
Person *p = [Person new];
[p run:^{
NSLog(@"000");
}];
p.run;
// 不支持
或者可以给他带一个参数:.h
@interface Person : NSObject- (void)run:(void(^)(int))runClick;
@end
.m
@implementation Person- (void)run:(void(^)(int))runClick {
runClick();
}@end
调用
Person *p = [Person new];
[p run(int m):^{
NSLog(@"run %d", m);
}];
p.run;
// 不支持
没错用Block作为参数, 或者作为属性, 可以帮你很好的传递值, 和某一个事件, 比起代理,通知, 好用的不止一点.. 不知你有没有常识过下面这种写法:.h
@interface Person : NSObject- (void(^)())run@end
.m
@implementation Person- (void(^)())run {
return ^() {
NSLog(@"run");
};
}@end
调用
Person *p = [Person new];
[p run];
// 不会调用打印
p.run();
// 打印 "run"
这个时候的点语法已经不会像上面那个一样报警告了哦, 但是这么写有什么用呢? 答: 目前没看出什么用, 不如加个参数, 还能参加参加计算...:.h
@interface Person : NSObject- (void(^)(int))run@end
.m
@implementation Person- (void(^)(int))run {
return ^(int m) {
NSLog(@"run%d", m);
};
}@end
调用
Person *p = [Person new];
[p run];
// 不会调用打印
p.run(10);
// 打印 "run 10"
【链式编程】但是, 我如果想连续计算呢? 答: 你可以计算完, 再将它返回呀, 比如:.h
@interface Person : NSObject- (Person *(^)(int))run@end
.m
@implementation Person- (Person *(^)(int))run {
return ^(int m) {
NSLog(@"run%d", m);
return self;
};
}@end
调用
Person *p = [Person new];
[p run];
// 不会调用打印
p.run(10).run(20).run(30);
// 打印 "run 10 run 20 run30"
咦, 这种写法好像在哪见过, SDAutoLayout? 还是Masonry? 记不清了, 反正简单demo在这里!