结论:嵌套中的block只需要写strongify,不需要再写一次weakify
只要持有block的变量和block中的变量不是同一个变量(可以指向同一个变量),就不会因此循环引用,导致memory leak。
下面对比两段代码:
@weakify(self)
self.blockA = ^{
@strongify(self)
[self doSomething];
//不加weakify
self.blockB = ^{
@strongify(self)
[self doSomething];
};
};
@weakify(self)
self.blockA = ^{
@strongify(self)
[self doSomething];
//加weakify
@weakify(self)
self.blockB = ^{
@strongify(self)
[self doSomething];
};
};
预编译之后:
不加weakify
@autoreleasepool {}
__attribute__((objc_ownership(weak))) __typeof__(self) self_weak_ = (self);
self.blockA = ^{
@autoreleasepool {}
__attribute__((objc_ownership(strong))) __typeof__(self) self = self_weak_;
[self doSomething];
self.blockB = ^{
@autoreleasepool {}
__attribute__((objc_ownership(strong))) __typeof__(self) self = self_weak_;
[self doSomething];
};
};
加weakify
@autoreleasepool {}
__attribute__((objc_ownership(weak))) __typeof__(self) self_weak_ = (self);
self.blockA = ^{
@autoreleasepool {}
[self doSomething];
@autoreleasepool {} __attribute__((objc_ownership(weak))) __typeof__(self) self_weak_ = (self);
self.blockB = ^{
@autoreleasepool {}
__attribute__((objc_ownership(strong))) __typeof__(self) self = self_weak_;
[self doSomething];
};
};
通过对比可以发现,第二层嵌套外增加的weakify(self)
编译之后为__attribute__((objc_ownership(weak))) __typeof__(self) self_weak_ = (self);
,和第一层嵌套外加的weakify(self)
编译之后的代码一样,做了相同的工作,无非就是重新定义了一个没有发生变化的self_weak_变量。
所以,当block嵌套block的时候,内部的block不需要再次增加@weakify(self)。