显示已发布对象的Xcode调试内存图

时间:2017-07-25 13:54:29

标签: ios swift xcode debugging xcode8

我一直在寻找一个项目的Xcode Memory Graph工具,并注意到一些奇怪的行为。希望有人能够解释发生了什么/我是否需要担心。

我有一个视图控制器,可以创建一些对象(此刻并没有做太多的事情)当我解除视图控制器时,它们肯定会被释放。但是在视觉调试器中似乎有一个(有时是两个):

enter image description here

只有两个人被创造出来,两个人都被取消了初始化,在我的合作中得到了证实:

enter image description here

我认为我说的是正确的,我对上面图片中引用User对象的任何对象不负责任,所以这是一个错误,或者只是我不喜欢的东西#39; t需要担心吗?

3 个答案:

答案 0 :(得分:1)

如果您不对图中描述的任何对象负责,那些是保留User对象的对象,您不必担心它。

仅供参考:在应用程序中包含Firebase之前,我遇到过泄漏事件。这不是你的错,它不应该泄漏很多记忆。

我同意@CharlesSrstka,如果您仍然担心泄漏,您也可以在仪器上检查它们,它会向您显示可能导致问题的特定代码行。

答案 1 :(得分:0)

"已发布用户"从对象的deinit方法中记录?如果是这样,对象被取消初始化,因此无论引用什么,都无法保持对象存活。鉴于此,我可能不担心它,尽管如果你想确定,最好的办法是启动仪器,加载分配工具,选择 - 单击运行按钮,然后检查&# 34;记录参考计数。"这样您就可以准确了解保留和释放对象的内容。

答案 2 :(得分:0)

我不确定这是不是发生在你身上的事情,但这发生在我身上,结果证明是Swift的内部记忆模型的结果,特别是它如何处理弱的和无主的引用。

为了使这适用于您,某些内容必须对您的User对象具有弱或无主引用。

如果是这种情况,当删除对象的最后一个强引用时,该对象将被取消初始化 - 它引用的任何内容将使其引用计数递减并在适当时释放,并且将运行其deinit()方法(如您的日志所示)。但是,它不会被取消分配

是的,一个物体可以被去除异化但不能解除分配!这样做的原因是,不得允许指向此对象的弱或无主引用指向释放(或更糟,重新分配)的内存,因为遵循此指针会产生“不安全”行为。结果,这段内存无法放弃,因此对象不会被释放。

然而,有两条好消息。首先,只泄漏特定对象 - 而不是它引用的任何对象。这意味着只有一小部分内存被泄露。所以这可能不是什么大问题。其次,对于弱引用,这种行为在Swift 4中发生了变化(令人遗憾的是,无主引用仍将具有此行为)。在Xcode9 beta中试用你的项目会很有趣,看看它是否仍然存在。

这一切都来自于在WWDC上提出相同类型的问题。希望结果是适用的!