2015-12-21 42 views
4

我的iOS应用程序中有一些保留循环。打印对象的强大拥有者,Swift

对于一个特定的viewController,卡在一个保留周期中,我试图让所有代表变弱。但是当我从模拟器模拟内存警告时,didRecieveMemoryWarning被调用,但是不调用deinit方法。

我想打印/查看当调用didRecieveMemoryWarning时仍然保持它的viewController的所有者。有什么办法可以做到这一点吗?

+1

我可能是错的,但我不认为你可以。 - 您是否尝试过使用“泄漏”工具进行配置?这可以显示保留周期。 –

+1

我不知道直接的方法,但是,如果您使用附加的Instruments运行应用程序并使用Allocations模板,则可以查看单个对象并查看其历史记录。 –

+0

请注意,接收到内存警告并不意味着会自动释放任何内容:您可以释放任何持有强引用并且不再需要的对象,也可以在需要时重新创建对象。视图控制器本身只有在从视图控制器层次结构中移除后才会被释放。 – jcaron

回答

2

没有没有办法为你描述打印物体的车主,至少不完全是。 iOS不使用垃圾回收,它使用ARC(自动引用计数)。系统不会跟踪拥有ARC中的引用。相反,每次向对象添加拥有引用时,系统都会增加保留计数,并且每次清除拥有引用时,系统都会递减保留计数。

但是,您可以做的是使用内存工具运行您的程序。 (有一个名为“Instruments”的调试应用程序,您可以选择一个在Instruments程序中使用的名为“instrument”的调试模板。)使用存储器工具,您可以跟踪对象的生命周期,以及跟踪当您在当前活动对象的列表中选择一个对象时,您可以看到程序中的哪个对象被分配以及创建强引用的代码来自哪里。然而,解释如何使用仪器超出了SO职位的范围。有关该主题的各种教程和WWDC会话视频。我建议做一些搜索。

至于你的问题,强制低内存警告不会导致一个活动的视图控制器(一个在屏幕上)被释放,它的deinit方法被调用。该系统对视图控制器保持强有力的参考。

此外,您应该使委托引用默认为弱。有一个强有力的参考代表参考是非常不寻常的。我只看过一两次,具体原因。

-1

您可以打印在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

10

如果您使用的是Xcode 8,则可以使用内存图调试器直观地查看项目中对象的活动内存图。您可以使用下面显示的三个圆圈图标进入Memory Graph Debugger。 enter image description here

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

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

+0

纯金!非常感谢兄弟;) –