【问题标题】:Does retain cycle for a block applies for methods the block call?块的保留周期是否适用于块调用的方法?
【发布时间】:2017-08-22 09:21:00
【问题描述】:

好的,我们知道如果我们这样做,我们可能会有一个保留周期

[someObject messageWithBlock:^{ [self doSomething]; }];

解决方案是这样的

__weak typeof(self) weakSelf = self;
[someObject messageWithBlock:^{ [weakSelf doSomething]; }];

但是如果我们执行最后一段代码但是 doSomething 有很多对 self 的引用呢?喜欢:

- (void) doSomething {
    self.myProperty = @"abc";
    [self doOtherThing];
}

这会创建一个保留周期吗?

然后呢:

__weak typeof(self) weakSelf = self;
[someObject messageWithBlock:^{ 
   self.onError(NSLocalizedStringFromTable(@"Error", MY_TABLE, nil))
}];

MY_TABLE 是#define

【问题讨论】:

  • 当我们有超过 2 个对象引用时,会创建保留循环。当超出范围时,ARC 会减少保留计数。但是,如果我们有超过 1 个对象的强引用,则会发生保留循环。 (i) 要删除保留循环,请始终采用对象的弱引用,特别是在块的情况下。因为块创建对象的单独副本我喜欢你所做的:__weak typeof(self)weakSelf = self; [someObject messageWithBlock:^{ [weakSelf doSomething]; }]; (ii) 对于功能没有任何问题
  • 请将此评论作为答案,以便我接受。谢谢
  • 我认为函数只是一种占位符代码,所以参考你的weak self不会有问题
  • 谢谢,我已经添加了答案

标签: ios objective-c iphone automatic-ref-counting


【解决方案1】:

当我们有超过 2 个对象的引用时,就会创建保留循环。当超出范围时,ARC 会减少保留计数。但是如果我们有超过 1 个对象的强引用,就会发生保留循环。

(i) 要删除保留循环,请始终采用对象的弱引用,特别是在块的情况下。因为块创建对象的单独副本我喜欢你所做的:

 __weak typeof(self) weakSelf = self; 
[someObject messageWithBlock:^{ 
[weakSelf doSomething];
 }]; 

(ii) 对于功能没有任何问题

- (void) doSomething {
    self.myProperty = @"abc";
    [self doOtherThing];
}   

【讨论】:

    【解决方案2】:

    此代码中没有保留循环:

    __weak typeof(self) weakSelf = self;
    [someObject messageWithBlock:^{ [weakSelf doSomething]; }];
    
    - (void) doSomething {
        self.myProperty = @"abc";
        [self doOtherThing];
    }
    

    说明

    在上面的代码中

    [weakSelf doSomething];
    

    表示接收者对象(self)现在已变为weakSelf,即。 doSomething 中对 self 的任何调用都将引用weakSelf。 因此,在 doSomething 中引用 self 不会创建保留循环。

    说说下面的代码:

    __weak typeof(self) weakSelf = self;
    [someObject messageWithBlock:^{ 
       self.onError(NSLocalizedStringFromTable(@"Error", MY_TABLE, nil))
    }];
    

    因为块内的接收者对象是self,而不是weakSelf,这将创建一个保留循环。

    【讨论】:

    • 谢谢。在第二个代码中 MY_TABLE 是一个定义,但假设它是在类上定义的 ivar。它会创建一个保留周期吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多