2010-12-23 73 views
1

我正在製作一個在許多XIB之間更改的應用程序。儘管Leaks工具不會調用它,但每當我加載一個新視圖時,程序的內存佔用空間越來越大。調用addSubview時潛在的泄漏[iPhone]

如果我註釋掉:

[self.view addSubview:currentView.view]; 

程序的內存使用量不會改變。

相關的代碼:

- (void)setPage{ 
[currentView release]; //retained 
switch (pageNumber) { 
    case 0: 
     currentView = [[TheViewController alloc] 
         initWithNibName:@"PageX" 
         bundle:nil]; 
     break; 
    ///Page 1, Page2, etc. 
} 
for (clearingView in [self.view subviews]) { 
    [clearingView removeFromSuperview]; 
    //[clearingView release]; = crash 
} 
[self.view addSubview:currentView.view]; //Leaky 
} 

我使用一個視圖控制器。

回答

1

當您添加子視圖時,其保留數量會增加。我沒有看到你要刪除currentView。如果您之前保留了它,然後在此功能中釋放它,則不會將其從視圖中刪除。

試着放一個[currentView removeFromSuperview];作爲第一行,看看是否有幫助。

編輯1: 其實,我看到你與循環中的所有其他意見一起去除currentView。既然如此,我真的沒有看到你的代碼有任何問題。我唯一能猜到的是,不知何故,ViewController或View的保留計數會在其他地方出現。

當發生低內存警告時,如果UIViewController類知道它可以重新加載或稍後再次創建,則清除它的視圖。如果發生這種情況,它還會調用viewDidUnload方法,讓您的代碼有機會放棄與視圖層次關聯的任何對象的所有權,包括使用nib文件加載的對象,在viewDidLoad方法中創建的對象以及在運行時並添加到視圖層次結構中。通常,如果您的視圖控制器包含插口(屬性或包含IBOutlet關鍵字的原始變量),則應該使用viewDidUnload方法放棄這些插口或您不再需要的任何其他視圖相關數據的所有權。

+0

在這種情況下,它是否應該在頂部或底部釋放。底部的崩潰是什麼意思?在哪一行?有什麼錯誤? – aepryus 2010-12-23 01:58:04

+0

(對不起,我刪除了以前的評論,與評論系統打架)如果我調用[currentView發佈];在addSubview下面,應用程序崩潰。我的錯誤可能與這個代碼包含在TheViewController中有關嗎? – Alex 2010-12-23 02:01:51

0

沒有什麼明顯的我可以在代碼中發現,但命名是有點混亂,你真的需要保留currentView。如果您在其他地方使用currentView,可能會這樣做,您將添加到會導致泄漏的保留計數中。

這裏就是我會傾向於做(注意,我在飛行打字所以它可能不是100%正確的!):

- (void)setPage{ 

    // Presuming you only want one subview at a time. 
    [[[self.view subViews] objectAtIndex:0] removeFromSuperview]; 

    UIViewController * newController = nil; 
    switch (pageNumber) { 
    case 0: 
     newController = [[TheViewController alloc] 
         initWithNibName:@"PageX" 
         bundle:nil]; 
     break; 
     ///Page 1, Page2, etc. 
    } 

    [self.view addSubview:newController.view]; 
    [newController release]; 
} 

我不認爲你需要一個類變量(currentView),這很好地包含在方法中。