![](/img/trans.png)
[英]iPhone App Crashes due to Low Memory but works fine in simulator
[英]iphone app crashes due to Low Memory but works fine in simulator
亲爱的所有人,我有一个基于导航的应用程序,带有大约60个UIControllerViews,分为4个部分。
我已经执行以下操作:1.构建和分析:bulid成功,没有任何抱怨。 2.仪器分配和泄漏:无泄漏。
但是,该应用程序在iPhone或iPad上崩溃了,但在模拟器中运行良好。 没有崩溃报告,但是我在crashreporter文件夹中确实看到LowMemory.log。
我已将iPhone和iPad升级到4.2
有谁知道可能出什么问题? 我已经阅读和故障排除了一个星期。
是否需要删除/释放UIControllerViews? 只需在视图之间导航即可使应用程序崩溃。
感谢您的任何帮助。
我的应用程序有一个名为contentViewController的根视图,用户可以从此处导航到4个测验。
这是我用来返回到根视图的代码。
- (void)goHome {
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle: @"Warning"
message: @"Proceed?"
delegate: self
cancelButtonTitle:@"Yes"
otherButtonTitles:@"No",nil];
[alert show];
[alert release];
}
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
[[self navigationController] setNavigationBarHidden:NO animated:YES];
if (buttonIndex == 0) {
NSArray * subviews = [self.view subviews];
[subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
self.view = nil;
if (self.contentViewController == nil)
{
ContentViewController *aViewController = [[ContentViewController alloc]
initWithNibName:@"ContentViewController" bundle:[NSBundle mainBundle]];
self.contentViewController = aViewController;
[aViewController release];
}
[self.navigationController pushViewController:self.contentViewController animated:YES];
}
else {
}
}
该模拟器不会为您提供有关内存警告的任何有用信息,您的应用在此运行,可以有效访问系统愿意提供的所有内存。 该设备是您需要测试内存使用情况的地方,如果您收到警告和崩溃的信息,那么您需要做一些文书工作以弄清楚您可以在哪里释放部分内存。
查看您的xcode控制台。 如果收到大量内存不足警告,则需要动态分配和取消分配视图,因为它们占用了设备过多的内存(模拟器的内存并不十分有限)。
但这可能是造成您崩溃的其他原因之一。 确保您正在执行调试构建(打开断点),以便调试器启动,并希望您可以看到崩溃发生在堆栈中的哪个位置。
您已经有了一些好的建议。 但是,我建议您花大量时间复查XCode的调试工具文档。 这样您就可以基本了解它们的功能以及如何使用它们。 在此之后,可以阅读有关iOS内存管理,自动释放池等的内容。
对于您的应用程序,您需要意识到iOS设备上没有交换空间。 因此,您不得不在其他平台上无法达到的程度来管理内存。 通常,这意味着您可以避免在内存中保留过多的查看数据。
对于当前的iPad,该应用程序可能只有约110MB的可用RAM。 具体数字可能取决于iOS版本。 无论如何,您都需要了解各种视图的数据结构(在内存中)的大小。 根据内存使用情况,可能会大量考虑60种不同的视图,如果管理不正确,可能很快就会用完。 这不像用Java或其他垃圾收集语言进行编程。
最后; 即使这听起来像是内存管理问题,也可能总是其他原因。 如果仍然有问题,则需要发布代码。 现在,真的是我们的工作了。 请记住,您没有虚拟机,也没有垃圾回收。
您正在用完内存,请始终记住如果分配内存,则必须释放它,在某些情况下,您可以使用自动释放,这样您就不会忘记在void dealloc方法结束之前释放它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.