美文网首页Siri开发OC基础内存管理
iOS block嵌套block中weakify的使用

iOS block嵌套block中weakify的使用

作者: 乳猪啸谷 | 来源:发表于2018-09-14 11:00 被阅读0次

    结论:嵌套中的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)。

    相关文章

      网友评论

        本文标题:iOS block嵌套block中weakify的使用

        本文链接:https://www.haomeiwen.com/subject/jnwngftx.html