【问题标题】:Can I really check an instance variable in a block like this?我真的可以像这样检查块中的实例变量吗?
【发布时间】:2013-11-02 15:52:05
【问题描述】:

This tutorial 建议您可以这样做:

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

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

【问题讨论】:

  • 参见 Blocks Programming TopicsBlocks and Variables 部分,该部分观察到块保持对被引用对象的强引用(或对于 ivars,隐式到 self),而不是复制它们。

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


【解决方案1】:

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

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

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

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

【讨论】:

  • "它清楚地表明捕获的是 self,而不是属性。"好吧,如果你写了self->_valid,那么self 被捕获也是很清楚和明确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
  • 1970-01-01
  • 2010-09-22
  • 2014-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多