iOS block巢狀block中weakify的使用

tingdongli發表於2018-09-14

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

相關文章