結論:巢狀中的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)。