【发布时间】:2011-07-25 16:08:18
【问题描述】:
我的内存管理有一个大问题。 A 实际上有一本大杂志,它的每一页都用他自己的 PageViewController 渲染。我的代码完全基于 Apple 文档的 PageControl 示例,如果你们曾经看过的话。
因此,在“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 时,我放在它们的超级视图(MainViewController 的视图)上的每个控制器的视图会释放它吗?如果没有,我该怎么做?这是我的问题吗?
提前致谢。
编辑:
看起来 Firoze Lafeer 一开始是正确的,问题是我的 UIImage 内存管理和我的视图保留。我只是设法 removeFromSuperview 每个 UIView。对于图像,看起来像使用 [UIImage imageNamed] 它实现了一个缓存(当 ios 需要时释放它¬¬)。我只是改变了使用[UIImage imageWithData:imageData]; 的方式,它没有实现缓存,我所有的对象现在都很开心。谢谢大家。 :)
【问题讨论】:
标签: objective-c iphone ipad memory memory-management