說起block,真是一個讓人既愛又恨的東西徐伐。
愛:太方便了贯钩。
恨:很容易造成內存泄漏,每次都要寫weakSelf太麻煩了办素。
不過相信大家都有發(fā)現(xiàn)角雷,在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方法所在的對象,所以沒有相互持有而無法釋放需曾。
仔細可以發(fā)現(xiàn)AFNetworking里吗坚,也是同樣的套路。
所以我們可以仿照來寫block方法呆万,只需兩步
1商源、聲明方法
- (void)blockAction:(void (^)(NSInteger value))block;
2、方法實現(xiàn)
- (void)blockAction:(void (^)(NSInteger))block
{
block(123);
}