Block是用来封装和保存代码,有点像函数,Block可以在任何时候执行,效率高。
根据Block在内存中的位置分为三种类型:
1、NSGlobalBlock:全局block,没有引用外部变量。如:
int a = 10;
void (^block)() = ^{
NSLog(@"block");
};
block();
2、NSStackBlock:栈block,引用外部变量, 当函数返回时block将无效。
int a = 10;
void (^block)() = ^{
NSLog(@"block %@", a);
};
block();
3、NSMallocBlock:堆block,对栈block进行copy,该办block就会从栈区复制到堆区,当函数返回时block依然有效。
block的用法:
1、作为属性。
比如:在Person类的.h文件定义属性:
@property (nonatomic, copy) void (^eat)();
使用时:
Person *p = [[Person alloc] init];
p.eat = ^(){
NSLog(@"eat");
}
2、作为方法的参数(函数式编程)
比如:在Person类的.h文件定义:
- (void)eat:(void(^)())block;
使用:
Person *p = [[Person alloc] init];
[p eat:^{
NSLog(@"eat");
}];
3、作为方法的返回值(链式编程)
如:Person类的.h文件定义:
- (Person *(^)(int m))run;
.m文件实现方法:
- (Person *(^)(int m))run {
return ^(int m) {
NSLog(@"跑了%@米", m);
return self;
};
}
使用:
Person *p = [[Person alloc] init];
p.run(200).run(300).run(400);
函数式编程:订阅代码与业务逻辑代码放一起。如AFN框架,网络请求的代码和得到请求结果的代码放一起。
响应式编程:当所有条件满足时就触发。如KVO,代理,通知都是响应式编程。
链式编程:简单理解就是通过连续“.”语法调用方法,方法返回的对象是方法本身。如Masonry框架。
(RAC,ReactiveCocoa框架,是函数响应式编程。)