链式编程

方法调用相信大家都已经在熟悉不过了, 比如以下代码:
.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在这里!

    推荐阅读