2009-11-20 184 views
4

我正在開發一個iPhone應用程序,我試圖將視圖推入導航控制器,之前我已經做了很多次,但是,我在使用此特定應用程序時遇到了一些問題。我有一個表視圖,當用戶選擇一個行的新觀點推到控制器:這個對象爲什麼被釋放?

DataWrapper *row=[[self.rows objectAtIndex:[indexPath section]] objectAtIndex:[indexPath row]]; 
DataViewController *nextController=[[DataViewController alloc] initWithNibName:@"Data" bundle:[NSBundle mainBundle]]; 
[nextController setInfo:row]; 
[nextController setRow:[indexPath row]]; 
[nextController setParent:self]; 
[self.navigationController pushViewController:nextController animated:YES]; 
[nextController release]; 

和它去罰款,直到用戶點擊後退按鈕,我得到一個異常,並使用NSZombieEnabled而得到這個:

-[DataViewController respondsToSelector:]: message sent to deallocated instance 0x4637a00 

所以我試圖刪除[nextController release]而事實上它的工作,但爲什麼????我分配了nextController,所以我應該釋放它,對吧?我覺得如果有這樣的事情發佈這個應用程序是不對的,我覺得它會失敗。請讓我知道你的想法。

+0

在父控制器的視圖中會發生什麼特殊情況(會/會發生)?也許涉及另一個實例變量,沒有保留或結束釋放? – dstnbrkr 2009-11-20 18:06:36

回答

5

您的nextController未被導航控制器保留。如果你釋放它,那麼因爲只有一個init/release對,該對象被釋放。稍後當navigationController嘗試向其發送消息時,會看到您看到的錯誤。

這也是爲什麼刪除[nextController release]修復了這個問題。

你是對的,如果你分配,你應該釋放它。但該警告是之後您的應用程序完成它,而不是之前

有些對象將在應用程序的整個生命週期中保持分配狀態,所以不要太難受。

+3

我認爲乾淨的方法是在'-viewDidLoad'方法中分配'DataViewController',然後在'-viewDidUnload'方法中再次釋放它。 – Alfonso 2009-11-20 21:11:52

+0

我明白了,當你使用pushViewController時,NavigationController會取得對象的所有權。我會嘗試在viewDidLoad中分配控制器。 – Leg10n 2009-11-21 01:33:31

+0

@ Leg 10n:除非文檔明確指出方法將保留一個對象,或者一個屬性擁有'保留'的setter,否則不會假定另一個對象將擁有所有權。 – freespace 2009-11-21 01:57:24

0

我猜[self.navigationController]返回nil,因爲如果它不是nil,它會保留你的對象。由於您的對象沒有被保留,所以看起來沒有對象試圖保留它,表明navigationController屬性爲空。

+2

這並不能解釋它爲什麼會起作用,但如果在'nil'上調用它,屏幕將不會顯示。 – igul222 2009-11-20 05:36:41

0

您的導航控制器有可能以某種方式被釋放,導致視圖控制器也被釋放?您可以通過在推動nextController之前保留導航控制器來測試它。

0

爲了進行調試,我將在您的DataViewController類中覆蓋-dealloc,並在其上設置斷點。

0

,但它似乎對類似工作:

DetailViewController *controller = [[DetailViewController alloc] initWithNibName:@"SomeView" bundle:nil]; 

controller.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; 
[self presentModalViewController: controller animated:NO]; 

[controller release]; 

那麼,爲什麼不工作pushViewController?

相關問題