如何理解"当使用带有__weak限定符的变量时,该对象始终在autoreleasepool"中注册。

时间:2017-03-11 10:01:46

标签: ios objective-c nsautoreleasepool

这本名为Pro Multreadingreading and Memory Management for iOS和OS X的书写了

  

为什么需要在autoreleasepool中注册该对象才能通过__weak限定变量使用该对象?因为使用__weak限定的变量没有强引用,所以可以在任何时候处置该对象。如果对象在autoreleasepool中注册,则在保留@autoreleasepool块之前,该对象必须存在。因此,要通过__weak变量安全地使用对象,该对象将自动在autoreleasepool中注册。

我不明白为什么__weak需要变量存在。 __weak不保留变量。如果变量不存在.__weak变量应为nil。为什么本书说"如果对象在autoreleasepool中注册,直到@autoreleasepool块被保留,对象必须存在&# 34。

如果它是在autoreleasepool中注册的。哪个池是注册的?当我使用__weak时,我没有分配自动释放池.Who可以告诉我原因。

1 个答案:

答案 0 :(得分:2)

在阅读__weak__autoreleasing限定符时,您正在阅读的书至少令人困惑,有时可能完全错误。 (这本书是一本翻译,这可能是因为使用的语言有时令人困惑。)

存储在__weak限定变量中的引用 not 也会自动添加到自动释放池中,这与弱变量的目的相反。

在某些情况下,当从弱变量加载引用时,编译器会将其置于自动释放池中以避免竞争条件(在释放的对象与从弱变量加载的引用之间) )。你不需要关心自己,至少是直接关注这一点 - 编译器只是确保你从弱变量加载的引用在你使用它时是有效的。

您可以在问题Objective-C - weak object is registered in autoreleasepool automatically?

中找到有关此书的其他评论

HTH