在 Swift 中应该为哪些变量使用 weak var?我如何找出泄漏点?

For what variables should you use weak var in Swift? How do I figure out the leaks?

我正在 Swift 中构建应用程序。我正在以完全编程的方式创建我的视图。在某些情况下,我有一个实例化自定义视图的 ViewController。此外,我可能有像 "var User" 这样的变量,它在 Alamofire 网络调用后被填充,并在整个视图控制器的各种 UI 元素中使用。除了将委托声明为 weak var 之外,还有其他适用的规则吗?

另外,有没有办法让我弄清楚我是否有一个应该是弱引用的强引用?我应该寻找什么?

Swift 中引用计数背后的基本概念是所有权 之一。对象应该持有对它们 "own" 的任何其他对象的强引用,因为它们负责另一个对象的生命周期,无论是单独还是与其他对象一起。

典型应用程序中的许多对象引用图是分层的 - 一个对象拥有一堆其他对象,每个对象都有自己的子对象等。例如,ViewController 拥有它的 window,window 拥有它的视图,每个视图拥有它的子视图,每个子视图拥有它显示的图像、字符串或其他内容。这些都是强引用。

弱引用通常用于不暗示所有权的引用。委托示例是一个很好的示例 - 在大多数情况下,视图 拥有委托。委托对象具有独立于视图的生命周期。在许多情况下,委托将首先是 created/owns 视图的同一对象,例如 ViewController.

想要一个从"child"到它的"parent"的强引用。这会创建一个循环引用,并且子项和父项都将在内存中徘徊,直到应用程序退出。

除了委托和其他 "backwards-pointing" 引用之外,您还会看到缓存中使用的弱引用,您希望在第二次请求时快速 return 一个对象,但是缓存如果当前没有人使用该对象,则不应将该对象保留在内存中。

为了正确回答您的问题,我们需要相当多的详细信息,(请...) 添加到您的原始问题中。

我会坦率地提醒您,"there are no rules" 任何问题基本上 "touchy" 都是弱引用。请特别注意不要 "follow rules," 想象您会 "be 'safe,'" 当您的应用程序设计的其他方面 明确 不要求使用它们时。

一个"weak"引用被定义为从一个事物到另一个事物的引用,你断言,"is not sufficient to cause the referenced object to not be garbage-collected."如果内存管理器确实决定"reap"这个对象,它是应该将你的 "weak" 引用设置为 NULL。它可以随时执行此操作 在最不方便的时间执行此操作。

在您的应用程序设计中值得考虑的一种可能性是使用由 "getter" 例程支持的 属性,,而不是实际的 变量。 或者,不是存储对 的 (weak ...) 引用,而是将其放入某种 "collection" 并存储其 id。是的,各种形式的 "getter routines" 每次都会执行,但在较长的 运行 中,这可能比过度依赖 更可靠 内存管理器。如果您知道 "all of the code, wherever situated," 必须通过 "this 'getter' routine,",您可以将您的 bug 避免工作集中在那个有意的夹点上。