2011-12-22 36 views
0

通常,當我們推視圖控制器,我們將創建一個視圖控制器對象,該行後,我們會推,然後鬆開。
但是,當我們在iOS5中運行它就會崩潰。所以我通過propery保留了這個對象,並把它聲明爲全局接口。現在它工作正常。保留視圖控制器會佔用大量內存嗎?以下兩種方案有什麼區別?的viewController對象BAD_ACCESS?

一:

MyViewCOntroller *obj = [[MyViewCOntroller alloc] init]; 
[self.navigationController pushViewController:obj Animated:YES]; 
[obj Release] 

二:

self.obj = [[MyViewCOntroller alloc] init]; 
[self.navigationController pushViewController:self.obj Animated:YES]; 
[self.obj Release] 

回答

1

一般來說,除dealloc之外,您不應該發佈property(self.obj)。
第二代碼段應替換:

self.obj = [[MyViewCOntroller alloc] init]; 
[self.navigationController pushViewController:self.obj Animated:YES]; 

,另一個在下面添加到您的dealloc方法:

self.obj = nil; // Property will release itself and set the point to nil 

第一代碼片段是OK,你alloced本地實例和之後發佈用過的。

0

你爲什麼不初始化與筆尖您的視圖控制器?

SearchView *secondViewController = [[SearchView alloc] initWithNibName:@"SearchView" bundle:nil]; 
    [self.navigationController pushViewController:secondViewController animated:YES]; 
    [secondViewController release]; 

小心保留任何物體。你必須完全確定你只是啓動它然後釋放它。如果你這樣做,你可能不關心記憶。你的inits之間的區別是:在第一種情況下你創建了ner對象。這不是保留,但可能是泄漏,我不舒服。我認爲你應該添加autorelease。在第二種情況下,你有一個對象的屬性(probebly,retain?)在標題中。你必須釋放它dealloc方法

+0

您沒有回答我的問題,由於某些原因,我沒有筆尖。 – nameless 2011-12-22 04:51:30

+0

我編輯了答案 – SentineL 2011-12-22 05:05:17

2

第一個應該是正確的,並請重新檢測墜機原因。當您使用第一個視圖控制器時,它不會崩潰。

至於差異:在第二個,如果你宣佈obj作爲一個自變量的var,你不使用ARC,你照顧obj像其他實例變量。你只需要在dealloc中發佈。

0

你傳遞視圖控制器的新對象? 如果是的話,你是釋放新視圖控制器的dealloc方法這個視圖控制器屬性?這將是一個雙重版本。 示例編號2將解決這個問題,因爲它可能在舊的視圖控制器中具有(保留)類型屬性,會將其保留計數設置爲2.