名为《面向iOS和OS X的Pro多线程和内存管理》的书写道:
为什么要通过__weak限定变量使用对象才能在autoreleasepool中注册该对象?因为使用__weak限定的变量没有强引用,所以该对象可能在任何时候被处理。如果对象已在autoreleasepool中注册,则在保留@autoreleasepool块之前,该对象必须存在。因此,为了安全地通过__weak变量使用对象,该对象会自动注册到autoreleasepool中。
我不明白为什么__weak需要变量存在。 __weak不会保留该变量。如果变量不存在。__weak变量应为nil。为什么这本书说“如果对象已在autoreleasepool中注册,则在保留@autoreleasepool块之前,该对象必须存在”。
如果它是在autoreleasepool中注册的,它是在哪个池中注册的?当我使用__weak时,我不分配autoreleasepool。谁可以告诉我原因。
最佳答案
您正在阅读的书在__weak
和__autoreleasing
限定词的介绍中至少令人困惑,有时甚至是完全错误的。 (这本书是翻译,这可能解释了有时使用的令人困惑的语言。)
存储在__weak
合格变量中的引用也不会自动添加到自动释放池中,这与弱变量的目的相反。
确实发生的情况是,在某些情况下,当从弱变量加载引用时,编译器会将其放入自动释放池中,以避免出现竞争状况(在释放对象与从弱变量加载其引用之间)。您无需为此而担心,至少不必直接担心-编译器只是确保从弱变量加载的引用在您使用时是有效的。
您可以在Objective-C - weak object is registered in autoreleasepool automatically?问题中找到这本书的其他评论
高温超导
关于ios - 如何理解“当使用带有__weak限定词的变量时,该对象总是在autoreleasepool中注册”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42733829/