我的內存管理有一個很大的問題。 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];
的方式,它沒有實現緩存,現在我的所有對象都開心了。謝謝大家。 :)
好吧,如果該視圖有幾個子視圖,那麼我必須刪除它們每個子視圖?...我實際上從scrollView中刪除該視圖,但我的內存不會減少。任何想法? – Linnk 2011-03-30 00:00:44
刪除視圖將從視圖層次結構中刪除其所有子視圖。如果視圖仍未被釋放,您應該在樂器中查看它們的歷史記錄。實際上,您可以使用「樂器」來確認這是您的記憶首先出現在哪裏。如果您在視圖中加載圖片,您確定要正確管理這些圖片嗎? – 2011-03-30 00:25:33
儀器的哪個組件可以做到這一點? – Linnk 2011-03-30 01:24:52