为啥应用程序在 iPhone 模拟器中崩溃;我怎样才能解决这个问题?

Posted

技术标签:

【中文标题】为啥应用程序在 iPhone 模拟器中崩溃;我怎样才能解决这个问题?【英文标题】:Why is app crashing in iPhone simulator; how can I fix this?为什么应用程序在 iPhone 模拟器中崩溃;我怎样才能解决这个问题? 【发布时间】:2010-11-07 21:47:20 【问题描述】:

我正在开发一个使用导航控制器的应用程序。当我构建时,我没有收到任何错误或警告。我在FirstViewController.m 文件中定义了一个方法myMethod,然后在viewDidLoad 中使用[self myMethod]; 调用该方法。

当我从控制台构建和运行时,我什么也没得到。所以我把NSLog() 声明如下:

-(void) viewDidLoad 
NSLog(@"Entering viewDidLoad");
[self myMethod];
NSLog(@"Called myMethod");
[super viewDidLoad];

控制台从不返回第二个 NSLog 语句,这让我相信应用程序在调用该方法时崩溃了。

我已尝试将模拟器设置为 ios 4.0.1 和 iOS 4.1。我正在针对 iOS 4.1 SDK 构建。非常感谢您提供的任何帮助。

更新:我运行了调试器,这似乎表明问题出在myMethod。在收到“EXC_BAD_ACCESS”之前,我只通过该方法中的几行代码完成它。代码行是:

-(void)myMethod 
NSMutableArray *someStuff;
NSMutableArray *someMoreStuff;

stuffSections=[[NSMutableArray alloc] initWithObjects:@"Some Stuff",@"Some More Stuff",nil];

someStuff=[[NSMutableArray alloc] init];
someMoreStuff=[[NSMutableArray alloc] init];

[someStuff addObject:[[NSMutableDictionary alloc]initWithObjectsAndKeys:@"Item Name",@"name",@"Item Picture.png",@"picture",@"http://theurl.net/",@"url",@"1",@"itemCode",nil]];

但似乎我无法通过第一次尝试向someStuff 数组添加内容。

【问题讨论】:

设置断点并使用调试器。并实际运行附加的调试器(不仅仅是调试目标)。 好的,我在 [self myMethod] 之后立即放置了断点。在调试器控制台中显示“程序接收信号:'EXC_BAD_ACCESS'。”不过,我对此很陌生,不知道调试器窗口中的这些结果是什么意思...... 尝试使用 command+Y 而不是 command+R 运行。这将在附加调试器的情况下启动。当你的程序崩溃时,执行将在有问题的行暂停,让你有机会找出它在哪里,并在那个时候检查你的变量的值。 嗯,我一直在这样做,但我并没有真正从所提供的信息中提取任何东西(似乎是自学的具有挑战性的部分)。我所知道的是,尝试将第一个 NSMutableDictionary 添加到 NSMutableArray someStuff 时失败。 【参考方案1】:

“myMethod”中似乎有问题。如果我不得不猜测,我会说您正在尝试引用一个自动释放而不是保留的对象。

【讨论】:

【参考方案2】:

您在初始化 someStuff 和 someMoreStuff 时缺少分配。应该是

   someStuff = [[NSMutableArray alloc] init];
   someMoreStuff = [[NSMutableArray alloc] init];

【讨论】:

我在代码中确实有它,但在这里没有输入。我想我会开始复制粘贴。对此感到抱歉。【参考方案3】:

您是否交叉检查了两个 MutableArrays?是否已成功分配?当应用程序进入损坏状态时,您会收到“EXC_BAD_ACCESS”,这通常是由于内存管理问题。我猜数组没有分配。

尝试以这种方式分配。

NSMutableArray * someStuff = [[NSMutableArray alloc]initWithCapacity:3];
NSMutableArray * someMoreStuff = [[NSMutableArray alloc]initWithCapacity:3];

在调试区添加断点,确认是否分配成功。如果这些数组中的每一个都有一个内存,那么它们就会被分配。

【讨论】:

以上是关于为啥应用程序在 iPhone 模拟器中崩溃;我怎样才能解决这个问题?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone 应用程序在 OS 3.1 不在模拟器中的设备上崩溃

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

在 iPhone 上测试时应用程序崩溃,但在模拟器中没有

为啥我的应用程序在模拟器中崩溃?

应用程序在 iPhone 上崩溃,但在模拟器上没有

设置基础 SDK 后,iPhone 模拟器在 NSKeyedUnarchiver 中崩溃