【问题标题】:App crash only on iPhone Device and not in Simulator应用程序仅在 iPhone 设备上崩溃而不在模拟器中崩溃
【发布时间】:2011-12-08 07:17:30
【问题描述】:

在我的应用程序中,当我按下按钮时,为该按钮调用的方法首先将我的文本字段文本直接分配给 NSArray 对象,例如:

 val = [[NSArray alloc] initWithObjects: nameText.text, cellText.text, p_emText.text, 
                                      p_cnfrmText.text, s_emText.text, s_cnfrmText.text,
                                      emailText.text, ecnfrmText.text, lat, longt,  
                                      nil];

当我在模拟器上运行我的应用程序时,没有发生应用程序崩溃,但是当我在我的 iPhone 设备上运行它时,它会给出:Thread 1: program recieved signal "EXC_BAC_ACCESS"

谁能说出为什么会发生这种情况以及这种情况的解决方案是什么?

【问题讨论】:

  • 尝试在此处发布您的完整代码。

标签: iphone objective-c ios xcode


【解决方案1】:

在 XCode 中,转到菜单“编辑方案”,选择运行配置并添加“NSZombieEnabled”,如下图所示,当您的应用程序崩溃时,它会为您提供有关崩溃的其他信息,以帮助您调试它。

编辑

请注意,当您的应用程序调试结束时,请删除 NSZombieEnabled 命令,因为它会影响应用程序性能

【讨论】:

  • 2011-12-08 14:18:41.670 DMFoundation[1750:707] *** -[CFString retain]: message sent to deallocated instance 0x1ed4b0 我是按照您的建议收到此消息跨度>
【解决方案2】:

使用initWithObjects 创建数组所涉及的所有对象都应该是实际对象。您的问题中没有足够的代码来知道 latlongt 是否也是对象。他们是吗?

如果不是,请使用[NSNumber numberWithFloa:<# the float #>] 包装它们。

如果这不是问题,请检查有关 EXC_BAC_ACCESS 的 SO 问题以学习调试它们。

【讨论】:

  • lat 和 longt 是字符串对象,val 是问题中所述的 NSArray
【解决方案3】:

从模拟器中删除应用程序/从 Mac 中删除构建文件/从 XCode 中清理产品,然后再次在模拟器中运行它。检查它现在是否在模拟器中崩溃。

看看这个链接:EXC_BAD_ACCESS signal received。此外,在将所有 textfield.texts 放入数组之前获取 NSLog。可能其中一个已经变成了nil。

【讨论】:

  • 我的应用程序不会在模拟器上崩溃,它只会在我的 iphone 设备上运行时因信号而崩溃
  • 对你有好处。您是否记录了文本字段的日志?您必须知道 BAD_ACCESS 是与内存问题有关的崩溃。
  • 当视图加载时我把@"";在所有文本字段文本中,因此永远不会为任何文本字段文本分配零。我已经在方法结束时释放了 val(正在接收信号),仍然没有解决问题
  • 2011-12-08 14:18:41.670 DMFoundation[1750:707] *** -[CFString retain]: message sent to deallocated instance 0x1ed4b0 I got this message by doing what you recommended 显然是一些字符串问题。一些字符串以某种方式被释放。
【解决方案4】:

这可能是内存管理的情况...您是否在使用后释放了所有对象?

模拟器拥有整台机器的内存空间......但iphone有一个单独应用程序的沙盒内存。

【讨论】:

  • 每当按下按钮时,我都会为 val 分配内存,并在该按钮的方法结束时将 val 释放为:[val release];还是有问题
【解决方案5】:

您的应用程序很可能由于内存问题而崩溃,因为它没有在模拟器中崩溃,请尝试释放您在完成分配时分配的所有对象。

如果您有您分配和初始化的自定义对象;

MyCustomClass *myObject = [[MyCustomClass alloc] init];

你需要将它们发布为

[myObject 发布];

特别是如果他们的成员被分配了大尺寸图像或其他类型的数据。

如果在您开始解决这些内存管理问题后,您的应用程序崩溃的情况开始减少,则表明您的方法是正确的。所以继续发布。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 2019-11-24
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    相关资源
    最近更新 更多