iphone应用程序由于内存不足而崩溃,但在模拟器中运行良好

时间:2010-11-26 00:17:23

标签: iphone memory crash

亲爱的,我有一个基于导航的应用程序,大约有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 {
}

}

4 个答案:

答案 0 :(得分:3)

模拟器不会向您提供有关内存警告的任何有用信息 - 您的应用程序在那里运行,可以有效地访问系统愿意提供的所有内存。该设备是您需要测试内存使用情况的地方,如果您收到警告和崩溃,那么您需要做一些工具来找出可以释放部分内存的位置。

答案 1 :(得分:1)

查看您的xcode控制台。如果你得到一些低内存警告,那么你需要动态分配和取消分配你的视图,因为它们在设备上占用了太多内存(模拟器不太受内存限制)。 / p>

但它可能导致你的崩溃大约有一百万个其他东西。确保你正在进行调试构建(断点打开),这样调试器就会启动,希望你能看到崩溃发生在堆栈的哪个位置。

答案 2 :(得分:0)

你已经有了一些很好的建议。但是我建议花很多时间来回顾一下XCode的调试工具文档。这样您就可以基本了解它们的功能以及如何使用它们。接下来介绍iOS内存管理,自动发布池等。

对于您的应用,您需要意识到iOS设备上没有交换空间。所以你被迫管理内存到你不需要在其他平台上。通常,这意味着如果可以避免,您不希望在内存中保留太多数据。

对于当前的iPad,应用程序可能只有大约110MB的RAM可用。具体数字可能取决于iOS版本。无论如何,您需要了解各种视图的数据结构(内存中)的大小。根据内存使用情况,可以考虑60种不同的视图,如果你没有正确管理它,你可能会很快耗尽。这不像Java或其他垃圾收集语言编程。

最后;即使这听起来像一个内存管理问题,它总是可能是其他东西。如果您仍然遇到问题,则需要发布代码。现在我们真的猜测我们的工作。只记得你没有VM,也没有垃圾收集。

答案 3 :(得分:0)

你正在耗尽内存,永远记住,如果你分配内存你必须释放它,在某些情况下你可以使用自动释放,所以你不要忘记在结束前使用void dealloc方法释放它。