我真的可以像这样检查一个块中的实例变量吗?

时间:2013-11-02 15:52:06

标签: objective-c memory-management objective-c-blocks

This tutorial建议你可以这样做:

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

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

1 个答案:

答案 0 :(得分:5)

  

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

没有。在实例变量的情况下,捕获self并将实例变量计算为self->_valid,即块运行时的值。

这就是为什么在某些情况下你会收到来自ARC的警告,关于隐式捕获self会引起参考周期。

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