2016-09-19 75 views
1

我看到奇怪的行爲與分配儀器在Xcode 8和Swift 2.3。我有一個被調用的對象(A),除了一個引用被釋放的對象之外,其他所有對象都被釋放(不是一個單獨的內存問題,據我所知),但對象繼續被列爲「現場」並持續存在於撥款文書中。此外,當我嘗試調試它的保留,我看到的是:Deinit叫對象仍然在內存中

  • 添加打印線到DEINIT方法:

    enter image description here

    請注意,我已經證實DEINIT正在被執行

  • 添加斷點到DEINIT方法
  • 驗證是否A引用被解除分配的其它對象,它們收到聲稱A.__deallocating_deinit的內部發生的釋放(-1)的引用計數方法

然而,由於一些未知的原因,它似乎堅持。

+0

確定,有可能對象沒有其他參考?根據ARC,對象將不會被釋放,直到引用計數爲0.因此,您可能會保持對該視圖的引用(在其他VC中)。 – Janmenjaya

+1

如果deinit被調用(並且已經返回),那麼該對象幾乎肯定會消失,不管它引用的東西是否還在。通常如果你看到這樣的問題,那就是你不期待的對象的第二個副本。 (「你還沒有預料到的第二個副本」實際上是各種看似不可能的行爲的原因。)檢查內存地址。但是我要尋找的另一件事是,你是否意外地將對象保留在'deinit'中。這會讓你陷入一片混亂(但仍然*可能*不會導致這種症狀;我打賭額外的副本)。 –

+0

@RobNapier我確實確認實際上只有一個對象正在創建。 「deinit」正在執行中,仍然沒有釋放對象。雖然我仍然不明白爲什麼會出現這個問題,但我在下面添加了答案,最終爲我解決了這個問題。 –

回答

1

經過幾個小時的搜索後,我終於設法(主要)弄清楚了。

在這種情況下,我有A類,它有6個屬性,其中一個是B類的一個實例.A類註冊B類塊回調.B類接收來自主運行循環外的事件,單獨的NSThread沒有正確包裝在@autoreleasepool中。因此,B類保留的時間比預期的要長,這導致其A區回調的區塊比預期更長。

我說的原因「大多是」想通了是因爲A類註冊的所有這些塊與[unowned self]。對於一個仍然未知的原因,這似乎足以讓deinit被執行,但不足以實際釋放該對象。結束語其他線程在@autoreleasepool允許應用程序來釋放B,這是當時足以釋放A.

+0

我打算讓這個答案沒有檢查一下,看看根據這個答案,其他人是否能夠確定真正解決問題的「最佳」解決方案。 –

相關問題