iOS-浅谈Block直接使用self(AFN、Masonry)

说起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);
}

你可能感兴趣的:(iOS-浅谈Block直接使用self(AFN、Masonry))