是否可以调试“由于内存错误而终止”?


78

在我的应用程序运行的某个(一致)时刻,我始终收到xcode错误消息

由于内存错误而终止。

我找不到导致错误的代码,但是可以告诉错误附近的代码(使用断点)。

该错误是在我实现中返回某个单元格后直接导致的

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

UITableViewDataSource委托方法。我可以确认它返回的是有效的UITableViewCell,但我认为解释并发布整个方法将浪费您的时间。但是,我怀疑这可能是由于快速大量分配内存引起的。

它肯定说Terminated due to memory error,不是内存压力。

我想知道消息的真正含义。另外,有什么方法可以调试此消息?没有崩溃报告生成。

我正在使用ARC和iOS 7。


1
我在Xcode中看到了相同的错误。我的应用程序崩溃是因为我正在创建一个超高的UIWebView(大于20000像素)。我从没有找到崩溃报告,也没有找到在崩溃之前获取内存警告的方法。
Heath Borders

@HeathBorders我也使用UIWebview。那很有趣。我将不得不检查我的身高。谢谢!
圣诞老人

这是这些组件的常见错误。可能的原因是:以某种方式生成了过多的像元(检查您的计算),像元大小是错误的(例如,除以0会生成一个nan,在计算大小时它是一个无限数)。或发生无限循环。
Pochi

@HeathBorders现在,我想知道您正在测试哪种设备?
圣诞老人,

我在iPad3上进行测试。另外,我UIWebView不仅超高,而且超宽(30000px)。
Heath Borders 2013年

Answers:


56

我收到此错误,无法理解是什么错误。

经过一番搜索,我发现我忘了禁用僵尸。

要禁用,请执行以下操作:

选择编辑方案

取消选择“启用僵尸对象


5
启用僵尸后,由于对象未释放,一切都会受到影响。在表视图的情况下,这会非常快地填满内存,在该表视图中,很多东西正在分配和释放。启用僵尸的定义:用“僵尸”对象替换释放的对象,该对象会捕获使用它的任何尝试。当您将消息发送到僵尸对象时,运行时将记录错误并崩溃。您可以查看回溯以查看触发僵尸检测器的呼叫链。
zirinisp 2015年

2
不过,我仍然面临这个问题。请指导我。
我是一名学习者

您如何禁用僵尸?
山姆

12

我遇到了同样的问题。(“由于内存错误而终止”)我已经尝试了以上所有答案,但对我来说却无济于事。然后我调试我的代码,发现for循环正在无限运行,每次都将内存分配给nil值的数组。它使用300 + MB,所以会出现此错误

谢谢。


你节省了我的时间。谢谢。
Saikiran K

7

我有完全一样的问题。我以为这导致我的程序出现内存泄漏或使用了太多内存。我使用工具,并使用分配配置文件和程序可以正常工作。我还通过设备运行了足够长的程序,它也可以正常工作。

我也使用iPad 3rd Gen进行调试,这可能是由于设备或错误的缓慢造成的,似乎只是Xcode并从Xcode运行而引起的问题。不是内存泄漏或分配问题。

如果您确定仪器本身并在设备上运行应用并正常工作


嗯 参与此帖子的每个人都已经在iPad第三代上进行了测试。巧合?
圣诞老人,

我只使用iPad第三代,所以还不确定。今天我已经订购了iPad mini视网膜,所以下周我可以肯定地回答;)
高冈智久(Tomohisa Takaoka

刚在iPhone5S上遇到过这种情况。刚刚添加了Google的跟踪代码,并且不得不将arm64的数量从arm64减少到arm7 / 7s,因为Google致力于构建arm64。我以为这是arm64 / 7s的事情。当然,不仅仅是iPad第三代问题。我在“ __connection_block_invoke_2中出错”,单独的搜索告诉我,这可能与下载过多和OOMing有关。遗憾的是缺少堆栈跟踪....
彼得

我在第二代iPad mini(iPad4,4)上遇到了它。
Slipp D. Thompson 2014年

3
使用NSURLSession下载整堆图像时,我遇到类似的问题。模拟器和独立设备(iPhone 6)正常运行。在仪器中,分配图看起来也很平滑。也不要崩溃。当我将设备连接到xCode时出现问题。无论构建配置(调试还是发布)。总是以神秘的“内存错误”结尾。
Neru

6

我使用Tesseract进行OCR,当我扫描目标文本时,应该播放GIF。当GIF开始播放时,内存从70-80MB增加到450MB。问题是GIF占用了过多的内存,该应用程序将崩溃并且Xcode将显示该消息。因此,我从ViewController的超级视图中删除了相关的imageView。

imageView.removeFromSuperview

在此之后,该应用程序仍会达到450MB的峰值,然后立即释放并降至40MB


1
我花了2天的时间修复内存崩溃,您的解决方案有所帮助。谢谢..!
艾莉莎


2

编辑方案,在“诊断”下您会找到几个选项来保护分配。有关详细信息,请参阅文档

问题是:它真的说“由于内存错误而终止”而不是“压力”吗?检查仪器是否您的应用程序内存不足,如果应用程序确实内存不足,那么无论确切的消息是什么,这都是您应该关注的重点。


1
它肯定说的是“错误”而不是“压力”。崩溃时内存级别始终保持在15 MB左右。
圣诞老人,

然后尝试启用malloc诊断。顺便说一句,您正在设备上进行测试吗?
LearnCocos2D 2013年

0

使用Xcode 11,它以Debug模式启动了我的项目。我正在做一些图像记录/编辑/返回给用户的操作,而这不是您可以使用的Debug。一旦我进入Release模式,一切就顺利了。


0

由于注意力不集中,我遇到了这类问题。

我一直在调用一个函数,该函数将imageView作为子视图添加到:

override func layoutSubviews() {
    super.layoutSubviews()
}

这会导致大量的内存使用,因此请注意这种事情!


0

Xcode 11.3中,我遇到了类似的问题,即每次我们按下“重试”按钮时摄像头都会通话。如果多次执行这些操作,则会发生崩溃。

当我们禁用Zombie对象时,此问题已修复。以下是步骤:

  1. 点击左上角的项目名称。这将显示项目中存在的目标列表。
  2. 点击编辑方案

屏幕截图1

  1. 选择运行选项->诊断->取消选中僵尸对象。

屏幕截图2

现在,运行您的项目。它应该工作正常。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.