自我如何传递给方法(或如何防止强引用周期)

时间:2012-12-10 13:09:28

标签: objective-c objective-c-blocks cycle self strong-references

我正在考虑在使用保留self的块时如何防止强引用周期。通常的方法似乎只是使用弱自我引用:

@property (strong, nonatomic) NSOperationQueue *queue;

- (void)methodA {
    __weak id *weakSelf = self;
    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
        [weakSelf methodB];
    }];
    [self.queue addOperation:operation];
}

但是如果methodB看起来像这样:

- (void)methodB {
    [self someOtherMethod];
}

这仍会导致强大的参考周期吗?或者,methodB会从methodA接收对self的弱引用作为对self的引用? (也就是说,methodB对self的引用只是对methodA的弱引用的强引用?)

2 个答案:

答案 0 :(得分:1)

  

或者methodB会从methodA接收对self的弱引用   它对自我的提及? (也就是说,methodB对自我的引用只是一个   强烈提及方法A的弱引用?)

方法不会“接收”强引用或弱引用。它收到一个参考。 “强”或“弱”仅适用于变量(通常是由块捕获的实例变量或变量)。

weakSelf是块中的弱引用。由于weakSelf是归零弱引用(__weak),因此它指向有效对象,或者其值为nil。如果是前者,则指向有效对象,并在其上调用methodB。如果是后者,向nil发送消息什么都不做,所以没有任何反应。

您询问self中的methodB是否是强引用。强引用意味着它会被保留,因此如果selfmethodB是强引用,则意味着它会在方法开头保留self并在结束时释放它。但是为什么该方法是否保留self之类的参数呢?保留周期是指对象强烈引用彼此。一个函数或方法将运行然后停止;他们对局部变量所做的任何保留必须是内存管理规则的临时保留,并且对保留周期没有影响。 (技术答案是否定的,self不会保留在ARC中,包括self在内的参数通常不会保留在MRC中。但正如我所说,这实际上并不相关。)

答案 1 :(得分:-1)

我终于找到了part in the documentation that kind of answers this question。所以看起来它看起来像是方法B接收了块对self的弱引用。