1

我目前正在考虑在使用保留自身的块时如何防止强引用循环。通常的方法似乎是只使用对 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 的弱引用的强引用吗?)

4

2 回答 2

1

或者methodB会从methodA接收到对self的弱引用作为对self的引用?(也就是说,methodB 对 self 的引用只是对 methodA 的弱引用的强引用吗?)

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

weakSelf是块中的弱引用。因为weakSelf是一个归零弱引用 ( __weak),它要么指向一个有效对象,要么它的值为nil。如果是前者,它指向一个有效的对象,并methodB在它上面被调用。如果是后者,发送消息到nil什么都不做,所以什么也不会发生。

你问selfinmethodB是否是一个强有力的参考。强引用意味着它被保留,所以如果self是强引用 in methodB,这意味着它self在方法的开头保留并在结束时释放它。但是,为什么该方法是否保留这样的参数很重要self?保持循环指的是对象之间的强引用。一个函数或方法将运行然后停止;根据内存管理规则,它们对局部变量所做的任何保留都必须是临时的,并且对保留周期没有影响。(技术答案是否定的,selfARC 中没有保留,包括在内self的论点通常不会保留在 MRC 中。但正如我所说,这真的不相关。)

于 2012-12-10T21:59:21.453 回答
-1

我终于在文档中找到了可以回答这个问题的部分。所以看起来methodB确实接收了块对self的弱引用。

于 2012-12-10T15:33:52.927 回答