说起block,真是一个让人既爱又恨的东西。
爱:太方便了。
恨:很容易造成内存泄漏,每次都要写weakSelf太麻烦了。
不过相信大家都有发现,在AFNetworking和Masonry的block里面都是可以直接用self的。我们看看Masonry的源码
- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block {
self.translatesAutoresizingMaskIntoConstraints = NO;
MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
block(constraintMaker);
return [constraintMaker install];
}
里面的block是一个局部的变量,在方法调用后就会释放,不会持有block方法所在的对象,所以没有相互持有而无法释放。
仔细可以发现AFNetworking里,也是同样的套路。
所以我们可以仿照来写block方法,只需两步
1、声明方法
- (void)blockAction:(void (^)(NSInteger value))block;
2、方法实现
- (void)blockAction:(void (^)(NSInteger))block
{
block(123);
}
网友评论