首先,对不起我的英语(我是西班牙语)和成为新手。我正在开发我的第二个用于学习的iPad应用程序,我在内存管理方面遇到了问题。我现在面对这个问题大约一个月了,所以我想也许这个伟大社区的一些专家可以帮助我一点。
我的情景是:
这是一个简单的电子书应用程序。我有一个主视图,用户可以从中打开两个模态视图。主要问题在于其中一个模态视图。在那里,我有一个管理所有页面的scrollview。现在,有12页。我试图释放所有东西等等,但是内存中仍然存在某些东西,因为在乐器内存不断增长,当我解开模态视图并返回时,经过几次,它会崩溃。页面是单独的xib,我用这个方法加载它们:
- (void)loadScrollViewWithPage:(int)page {
if (page < 0) return;
if (page >= MyNumberOfPages) return;
if ((NSNull *)controller != [NSNull null]) {
NSString *className = [NSString stringWithFormat:@"Pagina%d", page];
Class myClass = NSClassFromString(className);
controller = [[myClass alloc] initWithNibName:className bundle:nil];
// I have tried autorelease and even retain] autorelease.
[viewControllers replaceObjectAtIndex:page withObject:controller];
CGRect frame = scrollView.frame;
frame.origin.x = frame.size.width * page;
frame.origin.y = 0;
controller.view.frame = frame;
if (page != 0){
controller.view.tag = page;
}else {
controller.view.tag = 9999;
}
[scrollView addSubview:controller.view];
[scrollView sendSubviewToBack:controller.view];
[controller release];
}
}
我每次加载3页,一页可见,左右两页。我尝试以这种方式卸载(移除或移除)它们(对于3个加载的那些):
[viewControllers removeObjectAtIndex:pagi - 2];
[[scrollView viewWithTag:pagi - 2] removeFromSuperview];
所以我有两个问题......如果我按照上面的方法释放控制器,我的某些页面中的IBActions会使应用程序崩溃。但是,如果我无论如何都要发布它,并删除IBActions,那么内存也会不断增长。在仪器中,它没有泄漏,但在增加1mb或2mb的内存后崩溃。
我已经记录了所有页面viewDidUnload和deallocs,只有在有内存警告时才会卸载它们。
最后,对我来说更奇怪的是,如果我不使用[控制器发布];应用程序可以保持更长时间而不会崩溃。但是,当然,他们没有dealloc。
我认为问题可能在于此方法,但如果有帮助,我可以上传更多部分代码。只是不要在这里做太长时间。
有什么想法吗?
答案 0 :(得分:0)
总的来说,我可以说你必须在应用程序的这一点上释放控制器。上面几行,你打电话
[[myClass alloc] initWithNibName:className bundle:nil];
所以你必须释放它,因为你分配了它。如果您使用alloc,retain或copy,则您有责任释放这些对象。
但我猜你的问题是什么。你是如何定义controller
的?它是iVar还是属性?如果它是属性,则存在内存管理问题,因为未释放“旧”值。在这种情况下,请使用self.controller
代替controller
。
否则我无法想象为什么应用程序崩溃只有这个代码可用。 ; - )
Sandro Meier