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

ope*_*rog 2 memory-management objective-c objective-c-blocks

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

dispatch_async(queue, ^{
    if (_valid) {
        [self processFile:fileURL];
    }
});
Run Code Online (Sandbox Code Playgroud)

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

Kev*_*vin 5

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

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

这就是为什么你在这种情况下得到ARC的警告,关于隐式捕获self可能导致参考周期.

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