📚Effective OC - Tip 37,38: 理解 bl
2017-01-10 本文已影响10人
小万叔叔
^ block 的代言人
- 如果单单只作为一种 callback 或者函数指针的方式,我觉得并不足以体现 block 的强大,关键还是在于捕获变量。
void (^ name) (int a)
//Swift de closure 就更直接了
() -> T
- Block 分为栈,堆,全局, 全局块不捕获任何状态,所以也就不会导致循环引用的问题, 例如 UIView 。
- (void)testingHeapBlock:(BOOL)condition {
//标准的栈block,在ARC模式下已经变成了堆block,MRC才是栈Block,都为NSMallocBlock
void (^stackBlock)() = ^ {
NSLog(@"enter stackBlock");
self.current = @"123";
};
stackBlock();
void (^heapBlock)();//放到函数外部就会造成循环引用,内部不会
//这样写就变成了堆block了,因为有了赋值操作
heapBlock = ^{
NSLog(@"enter heapBlock");
self.current = @"123";
};
heapBlock();
}
//NSGlocalBlock, 不捕获状态,所以也就不会循环引用
void (^gobalBlock)(BlockViewController *type) = ^(BlockViewController *type){
NSLog(@"global block is %@", type.current);
};
- 使用 Typedef 来声明会更清晰
typedef void (^TypeBlock)(int a, int b);
TypeBlock typeBlock = ^(int a, int b) {
NSLog(@"enter typeBlock");
};
Extension
block 与 delegate 的区别
- block 方便,直观,就像吃蛋糕一样,我里面可以知道吃的味道, delegate 更强调过程,实际上应该是代理的设计模式,如果我要知道吃的过程中的蛋糕的松软程度,口感 等性质,是否可以用delegate反应出多种状态呢,像我们的 tableview 的 dataSource 以及 delegate.
- 另外 block 可以捕获当前环境的变量这一点提供了很多便利,也是我们愿意用 block的原因,如果很多变量需要 捕获,那用 delegate 是不是又不方便了?