我对在哪里使用强和在哪里使用弱有点困惑。是否有任何工具可以监控 ios 中的引用计数?
3 回答
当您希望类保留对对象的所有权并因此防止对象被释放,直到类不再需要它时,使用强引用。它通常用于无法廉价复制的对象(例如从服务器下载的数据)或在类运行期间至关重要的东西。
当您需要对对象的引用时使用弱引用。如果对象被其所有者解除分配,则该对象将消失。这通常用于循环引用,而不用担心对象未释放。
通常,您不必使用弱,除非避免保留循环。也就是说,只要你没有两个相互强引用的对象,你就可以了。
只是添加到其他评论中,虽然强引用循环(以前称为保留循环)很重要,但它们相对不常见,除非您将指向父对象的指针传递给它们的子对象。如果你正在做这种事情,你应该确保你理解一些 Apple 文档中概述的强引用循环(又名保留循环)的讨论,特别是Acquire Basic Programming Skills、Advance Memory Management和Transitioning to ARC。实际上,保留循环的常见示例是将指向父控制器的指针传递给子控制器。在这些情况下,一般应该做出这些指针weak
,否则strong
通常是相当安全的。
弱引用的另一种常见情况是 IBOutlets 用于 NIB 或 Storyboard 中的控件,通常也应该是weak
. (如果您通过控制将它们从 Interface Builder 拖动到头文件来制作插座,它会weak
为您制作它们。)无论如何,我将引用Resource Programming Guide中的内容,其中说:
出口通常应该是弱的,除了从文件所有者到 nib 文件中的顶级对象(或者,在 iOS 中,故事板场景)应该是强的。因此,您创建的 Outlets 通常默认情况下应该很弱,因为:
您为例如视图控制器的视图或窗口控制器的窗口的子视图创建的 Outlets 是对象之间的任意引用,并不暗示所有权。
强插座经常由框架类指定(例如,UIViewController 的视图插座,或 NSWindowController 的窗口插座)。