簡體   English   中英

UIViewController取消分配時不釋放子視圖(使用ARC)

[英]UIViewController not releasing subviews when dealloc (using ARC)

我的UIViewController似乎有一個奇怪的問題(非?)。 似乎控制器在取消分配時沒有釋放其子視圖。 我將NSLog消息放置在所有子視圖的dealloc方法以及視圖控制器中。 視圖控制器的dealloc被調用,但子視圖的未被調用。 但是,如果我隨后將該視圖控制器的另一個實例推送到導航堆棧上,則似乎會釋放前一個實例的所有子視圖(我在控制台中收到了一堆NSLog消息,讓我知道了)。 我已經檢查過了,並且在呈現的視圖控制器(正在執行推送的視圖控制器)中沒有對自定義視圖控制器的單獨引用。

一個很小的(也許)細節:自定義視圖控制器確實收到它存儲的一個塊,然后在彈出之前執行。 但是,我確實向其發送了nil,並且得到了相同的行為。 另外,當前的視圖控制器在彈出堆棧時會取消分配,因此沒有保留周期。

另外,我確實嘗試在自定義視圖控制器的dealloc方法中顯式釋放每個視圖。 行為相同。

導航控制器是否可能會堅持使用它? 我的其他任何視圖控制器似乎都沒有這樣做。

我的問題是,這確實代表了所有這些子視圖的內存泄漏; 盡管泄漏不會疊加,但仍然是泄漏。

好的,這很尷尬。 我確實在另一個我無意用作收集類的類(稱為ViewDef)中發現了問題。 當我第一次找出一些動畫時(幾個月前),這是跟蹤子視圖的一種快速而骯臟的方法。 ViewDef存儲了從數據庫中檢索到的幀/字體/顏色/等信息,因此在找出動畫時(在方向之間)還可以方便地存儲視圖。 這些ViewDef由我的模型存儲並傳遞,因此當然也保留了視圖(並在以后由另一個視圖控制器替換)。 無論如何,我忘了在代碼中插入警告以稍后解決。

故事的寓意:如果您打算做一些愚蠢的事情,請至少記錄下您的愚蠢行為,這樣您以后就不必在互聯網上廣播它了。

您可以嘗試在viewDidUnload方法中將子視圖設置為nil,這可能會有所幫助

嘗試做的一件事是確保所有子視圖委托都設置為nil。

暫無
暫無

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

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