iOS block的循环引用

__weak typeof(self) weakSelf = self;
self.blk = ^{
        __strong typeof(self) strongSelf = weakSelf;
        NSLog(@"Use Property:%@", strongSelf.name);
        //……
};
self.blk();

改为传参

self.blk = ^(UIViewController *vc) {
        NSLog(@"Use Property:%@", vc.name);
};
self.blk(self);

优点:

简化了两行代码,更优雅
更明确的API设计:告诉API使用者,该方法的Block直接使用传进来的参数对象,不会造成循环引用,不用调用者再使用weak避免循环

宏定义

#define WeakObj(o) autoreleasepool{} __weak typeof(o) o##Weak = o;
#define StrongObj(o) autoreleasepool{} __strong typeof(o) o = o##Weak;
@WeakObj(self);
[var setBlock:^{
    @StrongObj(self);
    [self doSomething];
}];

你可能感兴趣的:(iOS block的循环引用)