2011-03-29 59 views
1

我的內存管理有一個很大的問題。 A實際上有一個大雜誌,每個頁面都用他自己的PageViewController進行渲染。我的代碼完全基於Apple文檔的PageControl示例,如果你們有時看過。如何在一個NSMutableArray的viewControllers裏面釋放一個viewController和他的視圖?

所以,在我的 「MainViewController」 的viewDidLoad中創建一個NSMutableArray的= self.viewControllers全NSNull對象。我爲我的第一頁和第二頁撥打我的[self loadScrollViewPage:page];。當用戶導航到更多頁面時,我會調用(來自scrollViewDidScroll)更多負載[self loadScrollViewPage:nextPage];,因爲該應用程序將需要它。另外,我實施了一個unloadScrollViewPage:page'因爲雜誌太大了,以至於如果我不這樣做,記憶就會出來。

所以,這是我的代碼:

- (void)loadScrollViewPage:(int)pageNumber 
{ 
    if ((pageNumber < 0) || (pageNumber >= [self.viewControllers count])) 
     return; 

    PageViewController *controller = [self.viewControllers objectAtIndex:pageNumber]; 
    if ((NSNull *)controller == [NSNull null]) 
    { 
     controller = [[PageViewController alloc] initWithPage:[self.pages objectAtIndex:pageNumber]]; 
     [self.viewControllers replaceObjectAtIndex:pageNumber withObject:controller]; 
     [controller release]; 
    } 

    if (controller.view.superview == nil) 
    { 
     CGRect frame = mainpageScrollView.frame; 
     frame.origin.x = 0; 
     frame.origin.y = frame.size.height * pageNumber; 
     controller.view.frame = frame; 
     [mainpageScrollView addSubview:controller.view]; 
    } 
} 
- (void)unloadScrollViewPage:(int)pageNumber 
{ 
    if ((pageNumber < 0) || (pageNumber >= [self.viewControllers count])) 
     return; 

    if ((NSNull *)[self.viewControllers objectAtIndex:pageNumber] != [NSNull null]) 
    { 
     [[[self.viewControllers objectAtIndex:pageNumber] view] removeFromSuperview]; 
     [self.viewControllers removeObjectAtIndex:pageNumber]; 
     [self.viewControllers replaceObjectAtIndex:pageNumber withObject:[NSNull null]]; 
    } 
} 

的問題是,不管有多少次我打電話unloadScrollViewPage,內存還是增量大小,當我打電話loadScrollViewPage,且從未unloadScrollViewPage遞減。因此,當用戶在第10頁去(?300頁,大聲笑)我的應用程序的內存大小爲100MB的,當然,它崩潰:(

我的問題是:

  • 我從self.viewControllers NSMutableArray中正確地釋放內存嗎?我從self.viewControllers中刪除ObjectAtIndex:pageNumber時,我將它放在superview(MainViewController的視圖)上的每個控制器的視圖都會釋放它的內容?如果不是,我能做到嗎?這是我的問題嗎?

先進的感謝。

編輯:

貌似Firoze Lafeer是正確之初,這個問題是我的UIImage的內存管理和我的意見保留。我只是設法從每個UIView中刪除FromSuperview。對於圖像,看起來像使用[UIImage imageNamed]它實現了一個緩存(當ios需要時釋放它)。我只是改變了使用[UIImage imageWithData:imageData];的方式,它沒有實現緩存,現在我的所有對象都開心了。謝謝大家。 :)

回答

0

右鍵,當您添加每個視圖滾動視圖,滾動視圖將保留這一觀點。因此,在卸載每個頁面時,您必須刪除每個視圖。

順便說一句,我想你會發現視圖控制器本身並不佔用很多內存的。意見是更大的問題。

+0

好吧,如果該視圖有幾個子視圖,那麼我必須刪除它們每個子視圖?...我實際上從scrollView中刪除該視圖,但我的內存不會減少。任何想法? – Linnk 2011-03-30 00:00:44

+0

刪除視圖將從視圖層次結構中刪除其所有子視圖。如果視圖仍未被釋放,您應該在樂器中查看它們的歷史記錄。實際上,您可以使用「樂器」來確認這是您的記憶首先出現在哪裏。如果您在視圖中加載圖片,您確定要正確管理這些圖片嗎? – 2011-03-30 00:25:33

+0

儀器的哪個組件可以做到這一點? – Linnk 2011-03-30 01:24:52

0

你的代碼的其餘部分看起來像它應該表現你期望它不過這兩行可能不正確的方式。

[self.viewControllers removeObjectAtIndex:pageNumber]; 
    [self.viewControllers replaceObjectAtIndex:pageNumber withObject:[NSNull null]]; 

第一行將刪除對象並將其上的所有索引減1,因此您的數組將會變小。然後,您在曾經比您刪除的對象高出一個索引的對象處調用replaceObject。的這兩行代碼將每一個它叫,直到你得到一個出界異常,當你去通過array.You的實際長度可以刪除的removeObject線和replaceObject將發佈該對象的時間減少你的數組的大小它是自己的,同時讓陣列保持相同的大小。

這可能不會解決您的問題,但它會以相同的方式遞減保留計數器。也許這將有助於發佈調用這些方法的代碼。

+0

你是對的,但是,實際上這並不能解決我的內存問題。 – Linnk 2011-03-30 00:04:40

相關問題