ios - 如何理解“当使用带有__weak限定词的变量时,该对象总是在autoreleasepool中注册”

标签 ios objective-c nsautoreleasepool

名为《面向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/

相关文章:

ios - 弹跳 UIScrollView - 提示还有更多

ios - 动画 CALayer

沙盒环境中的 iOS ApplePay

Objective-C 自动释放池不释放对象

ios - 找不到文件 - GoogleUtilities/Libraries/libGTM_NSData+zlib.a

IOS 在 ScrollView 之间拖放

ios - 静态图像的 Google 硬纸板、桶、镜头畸变

ios - iOS 如何暂停 10 秒发送输入而不丢失数据

ios - 如何重现罕见的 "_CFAutoReleasePoolPop"崩溃?

objective-c - Objective-C 中 BFS 的内存注意事项