打印对象的强所有者,Swift

Print strong owners of an object , Swift

我的 iOS 应用程序中有一些保留周期。

对于特定的 viewController,卡在保留周期中,我尝试让所有委托变弱。但是当我从模拟器模拟内存警告时,调用了didRecieveMemoryWarning,但没有调用deinit方法。

我想 print/see 调用 didRecieveMemoryWarning 时仍持有它的 viewController 的所有者。有什么办法可以做到这一点。

你可以像

一样在 deinit 方法上打印
class Person {
    let name: String
    init(name: String) {
        self.name = name
        print("\(name) is being initialized")
    }
    deinit {
        print("\(name) is being deinitialized")
    }
}

你可以检查这个:Automatic Reference Counting

不,没有办法像您描述的那样打印 object 的所有者,至少不完全是这样。 iOS 不使用垃圾 collection,它使用 ARC(自动引用计数)。系统不跟踪 ARC 中的拥有引用。相反,每次添加对 object 的拥有引用时,系统都会增加保留计数,而每次清除拥有引用时,系统都会减少保留计数。

不过,您可以做的是 运行 使用记忆工具编写程序。 (有一个名为 "Instruments" 的调试应用程序,您可以选择一个名为 "instrument" 的调试模板,您可以在 Instruments 程序中使用它。)使用记忆仪器,您可以跟随 life-cycle object,以及跟踪应用程序堆中活动 object 的数量。当您 select 当前活动 object 列表中的 object 时,您可以看到它在你的程序中被分配到哪里,以及创建强引用的代码来自哪里。然而,解释如何使用 Instruments 超出了 SO post 的范围。有各种关于该主题的教程和 WWDC session 视频。我建议做一些搜索。

关于您的问题,强制发出低内存警告不会导致释放活动视图控制器(on-screen)并调用它的 deinit 方法。系统保持对视图控制器的强引用。

此外,您应该默认使委托引用弱化。将委托引用作为强引用是非常不寻常的。由于特定原因,我只看过一两次。

如果您使用的是 Xcode8,则可以使用内存图调试器直观地查看项目中对象的活动内存图。您可以使用下面显示的三个圆圈图标访问内存图调试器。

内存图调试器在 WWDC 2016 的以下讲座中突出显示,大约从 24:30 开始。

https://developer.apple.com/videos/play/wwdc2016/410/