__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);
優(yōu)點:
簡化了兩行代碼,更優(yōu)雅
更明確的API設(shè)計:告訴API使用者,該方法的Block直接使用傳進來的參數(shù)對象,不會造成循環(huán)引用,不用調(diào)用者再使用weak避免循環(huán)
宏定義
#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];
}];