簡體   English   中英

在NavigationController中取消分配

[英]Dealloc in NavigationController

在UINavigationController中,何時調用dealloc? 在我的應用程序中,我有4個ViewController:

View1Controller-> View2Controller-> View3Controller-> View4Controller

如果im在View2Controller中並按“后退”按鈕轉到View1Controller,則將調用View2Controller中的dealloc。 但是,如果im在View1Controller中並轉到View2Controller,則從未在View1Controller中調用dealloc。

可以嗎 還是泄漏?

謝謝。

編輯

一般而言,在UINavigationViewController堆棧上推入和彈出視圖控制器的行為就像一個堆棧。 如果您有一個包含數字的堆棧,將其推入2,則36將為您提供2個數字的堆棧,您不會期望2消失。 推送視圖控制器是完全一樣的,當您推送ViewController2時,您不會期望ViewController1消失。

但是,彈出會有所不同。 如果您彈出36,則不會期望36仍然存在。 與視圖控制器相同。 彈出ViewController2,當用戶界面顯示ViewController1視圖時,它將取消分配。

這也與保留計數有關。 如果彈出視圖控制器並且您沒有以其他任何方式引用它,則引用計數將為零,iOS可能會在不久后對其進行分配。 如果您以某種方式引用它(例如,擁有類中的一個成員),並且當引用計數從導航堆棧中彈出時未將其計數為零,那么此時該引用計數將不會被釋放。

在視圖控制器中檢查NSTimer。 如果存在NSTimer,則在控制器的viewWillDisappear或viewDidDisappear中使其無效。

將ViewController推入導航堆棧不會卸載/取消分配您來自的View Controller。 它仍然存在於新堆棧下的堆棧中。 如果尚未在其他任何位置保留它(使用強指針),則從視圖控制器彈出會取消分配它。

編輯:為什么View4Controller會對View2Controller中發生的事情做出任何反應? 從您描述的方式來看,它甚至根本不應該位於導航堆棧中。

編輯2:

要記住的一件事是,當您將某物推入導航堆棧時,其保留計數將增加1。如果從導航堆棧中彈出某些內容,其保留計數將減少1。通常,當對象的保留計數達到0,它將被取消分配。

推送時 ,您要推送的項目(現在位於您剛推送的項目下方)的保留計數沒有更改。 它仍由導航控制器保留,因此不會取消分配,而是消失。 彈出時 ,彈出項目的保留計數確實會減少,如果變為0,則會取消分配。

暫無
暫無

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

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