【问题标题】:Will self be retained by ARC in this situation?在这种情况下,自我会被 ARC 保留吗?
【发布时间】:2013-01-28 15:23:17
【问题描述】:

我在方法中有以下代码:

UIImageView* imageBlk = self.image;
self.finishBlock = ^{
    imageBlk.hidden = YES;
}

在 ARC 下,self 是否会因为 image 是 self 的属性而被块保留?谁拥有 imageBlk?自己?

【问题讨论】:

标签: iphone ios ipad automatic-ref-counting


【解决方案1】:

self 会被区块保留吗?不,不会。 imageBlk 变量不是实例变量,因此块不需要保留 self。您发布的代码中无需担心保留周期。

谁拥有imageBlk imageBlk 是一个堆栈变量。该块将保留变量。 ARC 负责这种保留,并在适当的时候适当地释放它。

谁拥有self我们无法从这段代码中回答这个问题。曾经分配过该对象的人将拥有它。曾经保留它的人也拥有它。

【讨论】:

  • 有道理,但会引出另一个问题,我将在另一个线程中提出。如果 imageblk 本来是一个实例变量,为什么块会保留 self (它是否对私有 ivars 和属性都这样做?)保留对象本身应该足以确保它的存在?那么为什么要保留自我呢?
  • 参见developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/…的“在捕获自我时避免强引用循环”
【解决方案2】:

不,因为imageBlkself.image 不同! imageBlk 是一个局部变量,不属于任何人。块内的imageBlkimageBlk 的只读副本,而不是同一个变量。如果你希望它是同一个变量,你必须使用__block 声明。

【讨论】:

  • 如果 imaBlk 不属于任何负责在范围结束时发布它的人?我认为默认情况下,变量会被保留,而不是在块内复制。指针是一个副本,就像在任何其他 C 函数中一样,但它指向的对象应该是实际对象。如果您是真的,那么只有实现了 NSCopying 的实例才能在块内传递。所以问题仍然存在。
  • @Meda 如果你使用 ARC,它负责在作用域结束时调用 release,否则你会,但不是 self。在没有__block spezifier 的块外部声明的变量在块内部是只读的。您不能为块内的imageBlk 分配新值。对象与变量不同。里面和外面的Object是一样的,但是变量不一样。
【解决方案3】:

代码很好。 在块外声明的变量是只读的,您不能更改它的值。
但是......你不会改变价值!您只需在值上“调用一个方法”,即 [imgBlock setHideen:YES];
完全合法。一切都将完美无缺。 Block 会根据需要保留 imgView。

【讨论】:

  • 你说的是真的,但你没有回答问题 - self 会被区块保留吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多