簡體   English   中英

Deinit被稱為但對象仍在記憶中

[英]Deinit Called But Object Still in Memory

我在Xcode 8和Swift 2.3中看到了分配工具的奇怪行為。 我有一個對象(A),在其上調用deinit ,除了其中一個對象,A引用被釋放(據我所知,不是一個單獨的內存問題),但對象繼續被列為“實時”並在分配工具中持久存在。 另外,當我嘗試調試它的保留時,我看到的只有:

在此輸入圖像描述

請注意,我已確認deinit正在執行:

  • 在deinit方法中添加打印行
  • 在deinit方法中添加斷點
  • 驗證A引用的其他對象是否已取消分配,並且它們收到聲明發生在A.__deallocating_deinit方法內的release(-1)引用計數

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

經過幾個小時的搜索,我終於設法(大部分)弄明白了。

在這種情況下,我有一個類A,它有6個屬性,其中一個是類B的實例。類A用類B注冊塊回調。類B接收來自主運行循環外部的事件,在一個單獨的NSThread上沒有正確包裝在@autoreleasepool中。 結果,B類保留的時間比預期的長,這導致其對A的回調被保留的時間長於預期。

我之所以說“大部分時間”都認為這是因為A級用[unowned self]注冊了所有這些塊。 由於一個仍然未知的原因,這似乎足以讓deinit被執行,但還不足以實際釋放該對象。 在@autoreleasepool中包裝其他線程允許應用程序釋放B,這足以釋放A.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM