0

嗨我有一個非常基本的內存管理問題與我的UIViewController(或任何其他對象,我創建); 問題是,在儀器中,我的對象分配圖總是上升,即使我在調用釋放然後分配它們爲零。UIViewController內存管理

我有2個UIViewController子類,每個用NIB初始化; 我第一個視圖控制器添加到像[window addSubView:first.view]; 的主窗口,然後在我的第一個視圖控制器榫文件我有一個加載第二個視圖控制器就像一個按鈕:

-(IBAction)loadSecondView{ 
    if(second!=nil){ //second is set as an iVar and @property (nonatomic, retain)ViewController2* second; 
     [second release]; 
     second=nil; 
    } 
    second=[[ViewController2 alloc]initWithNibName:@"ViewController2" bundle:nil]; 
    [self.view addSubView:second.view]; 

} 

在我的(第二)ViewController2我有一個按鈕操作方法

-(IBAction) removeSecond{ 

    [self.view removeFromSuperView]; 
} 

請讓我知道,如果上述方案在託管方式運行內存...? In Instruments它不顯示任何分配的發佈並且保持條狀態圖不斷上升。

回答

1

首先,爲什麼要使用這個方案時,第二個是一個屬性:

if(second!=nil){ 
    [second release]; 
    second=nil; 
} 
second=[[ViewController2* second]initWithNibName:@"ViewController2" bundle:nil]; 

一個屬性格式會自動釋放它的老值用於設置方法時。所以這可以改寫爲:

if(self.second == nil) { //Prevents creating a new controller if there already is one. 
    self.second = [[[ViewController2 alloc] initWithNibName:@"ViewController2" bundle:nil] autorelease]; 
} 

另外,怎麼樣[ViewController2* second]? 爲什麼那裏有星號,類方法second是做什麼的?

+0

對不起,這只是一個撥打電話....我想念輸入它.... 感謝您的意見...糾正我,如果我錯了,但我從你的理論理解是,如果我繼續分配iVAr集作爲屬性,它會自行釋放以前的分配? – jAmi 2010-05-13 11:48:43

+0

是的,當setter被調用時,屬性將始終(afaik)釋放它以前的值。當你將屬性定義爲'(retain)'時,它將釋放舊對象並保留新對象。 請注意:在執行此操作時:'self.someStringProperty = [[NSString alloc] init]',屬性將保留新值,因此保留計數爲2。 'self.someStringProperty = [[[NSString alloc] init] autorelease]'會阻止這一點。 – Rengers 2010-05-13 12:22:33

+0

好吧,我試過你的建議,但 if(self.second!= nil){//防止創建一個新的控制器,如果已經有一個。 self.second = [[[ViewController2 alloc] initWithNibName:@「ViewController2」bundle:nil] autorelease]; } 永遠不會被調用,所以我改變if條件爲if(self.second == nil) 哪些工作,但然後我的圖形在對象分配仍然上升。 – jAmi 2010-05-13 12:58:44