2

本教程建议您可以这样做:

dispatch_async(queue, ^{
    if (_valid) {
        [self processFile:fileURL];
    }
});

但我持怀疑态度。块复制变量的值(捕获范围)。所以 _valid 将是 YES 或 NO 取决于我创建此块时的情况。该块将使用这个捕获的值,而不是查找实例变量的实际值。正确的?

4

1 回答 1

5

该块将使用这个捕获的值,而不是查找实例变量的实际值。正确的?

否。在实例变量的情况下,self被捕获并且实例变量被评估为self->_valid,即块运行时的值。

这就是为什么您在某些情况下会收到 ARC 的警告,即隐式捕获self会导致引用循环。

这也是您应该始终使用属性而不是直接使用实例变量的另一个原因。它使self捕获的内容变得清晰明确,而不是属性。

于 2013-11-02T15:57:13.380 回答