2011-02-28 75 views
0

即時通訊存在問題,當我的自定義UIViewController(MyVC)的dealloc方法在彈出時未被調用。閱讀其他一些關於SO的答案,似乎一個罪魁禍首可能是我仍然在某處引用MyVC,這就是爲什麼dealloc沒有被調用。未在UIViewController中調用dealloc方法的問題

Obj *objA = [[Obj alloc] initWithValue:value]; 

MyVC *newVC = [[MyVC alloc] init]; 
newVC.somIvar = objA; 

[self.navigationController pushViewController:newVC animated:YES]; 

[newVC release]; 
[objA release]; 

什麼我仍然困惑的是這是否意味着推動MyVC還是根視圖控制器(RootVC)具有對它的引用,或者裏面的東西MyVC本身不釋放這似乎很奇怪,因爲它的dealloc方法不被稱爲如此obv它仍然有其所有對象的引用?

據我所知從推到彈出MyVC事件的順序是:

  1. 創建和當按下導航欄,popViewControllerAnimated後退按鈕如上
  2. 描述從RootVC推MyVC :在navigationController中調用並且MyVC被彈出
  3. 如果沒有對MyVC的進一步引用,那麼navigationController會調用它的dealloc方法?

不確定3號?我還沒有發現任何使用儀器的泄漏,似乎它不能在MyVC中使用,因爲它的dealloc方法甚至沒有被調用,所以它會如何清理它呢?

回答

0

由於您使用點符號將您的vC分配給另一個對象的iVar,因此該對象將保留它(假設您聲明瞭屬性聲明中的保留)。

除非您在對象的'class'dealloc方法中釋放iVar(因此vC),否則即使對象彈出也不會被釋放。因此,將[somIvar release]添加到對象dealloc方法中,並且所有應該都是好的...

順便說一下,在將對象分配給iVar後,您可以安全地釋放vC,因爲它將由對象保留,直到它自己釋放爲止。

+0

Thx的迴應,雖然我很困惑,因爲「因爲你使用點符號將你的VC分配給另一個對象的iVar」。我以爲我是在我的newVC中分配ojbA給ivar而不是其他方式?我在newVC的dealloc方法中也有[someIvar release],但是如前所述,dealloc方法永遠不會調用newVC,因此[someIvar release]也永遠不會被調用? – James 2011-02-28 20:35:59

+0

@James:你說得對,Toastor似乎已經變得困惑。這是objA被保留在那裏(至少如果該財產是宣佈保留,而不是分配或複製)。我發現您發佈的代碼中沒有任何內容會導致newVC有額外的保留。 – Anomie 2011-02-28 20:50:29

+0

你說得對。我混淆了事情,對不起!好吧,事情並不那麼明顯我害怕......我會再次考慮並刪除我的答案,如果我不提出另一個想法...再次,我很抱歉! – Toastor 2011-02-28 21:00:41

相關問題