【问题标题】:warning: received memory warning level 1 and crashes警告:收到内存警告级别 1 并崩溃
【发布时间】:2011-09-12 04:28:11
【问题描述】:

我一直在研究这个问题,有人说只要应用程序不崩溃,这个错误就可以了。

我的应用程序出现此错误,之后当我尝试点击单元格的一行(调用 didSelectRowAtIndexPath)时,它崩溃了。它给了我一个错误 UIImage sent message to deallocated message。我猜这是因为内存警告释放了一些 UIView,因此它崩溃了。

为什么会这样,我该如何解决?我已经调试了很长一段时间,使用仪器、分析等,但没有运气。 我想发布一些代码,但不知道该发布哪一个。

【问题讨论】:

  • 您是否使用NSZombiesEnabled 准确跟踪错误出现的位置?如果是这样,请为 didSelectRowAtIndexPath 向该 UIImage 发送消息的部分发布一些代码。
  • 我正在使用 NSZombiesEnabled,当它崩溃时它指向 main.m,特别是 int retVal = UIApplicationMain(argc, argv, @"CVore", nil);
  • 您的一些代码可以帮助我们。尝试在您的 didSelectRowAtIndex 中发布一些代码。

标签: iphone objective-c ipad memory-management


【解决方案1】:

你没有保留你关心的东西。从您的消息中,我怀疑该对象是UIImage。首先运行静态分析器,看看你是否没有保留一些明显的东西。然后检查您的 ivars,尤其是与图像相关的。确保您使用访问器而不是直接访问您的 ivars(在 init 中,访问器本身和 dealloc 除外)。确保你的对象属性是用“retain”定义的。

您可以使用“僵尸”工具来帮助您追踪哪个对象保留不足。

【讨论】:

  • 我启用了 NSZombie,但我的应用程序中没有任何 UIImage。这就是为什么我要拔头发的原因...我最接近 UIImage 的是 TTImageView
  • 嗯,TTImageView 几乎可以肯定里面有一个 UIImage,所以这是一个很好的查看位置。你可能没有保留它。您还应该确保在viewDidUnload 中将所有IBOutlets 设置为nildeveloper.apple.com/library/ios/#documentation/Cocoa/Conceptual/…
  • 我应该在 viewDidUnload 或 dealloc 中将 IBOutlet 设置为 nil 吗?
  • 还有一个问题是我不知道如何重现此错误.. 当应用程序在设备而不是模拟器中运行时,这种情况更频繁地发生.. 也当只有这个应用程序作为唯一的单一应用程序运行。我认为它不会崩溃
  • 您应该在 viewDidUnload 中将 IBOutlet 属性设置为 nil (self.label=nil)。您应该在 dealloc 中释放 IBOutlet ivar ([_label release])。如果要在模拟器中测试内存不足的情况,请使用硬件>模拟内存警告。
【解决方案2】:

您的一位 cmets 很清楚,问题在于内存管理和释放您的对象....我建议您深入了解您的代码并找出您所在的代码 sn-ps释放您的对象(或分配它们)...这也可能是因为您在分配后根本没有释放您的对象,并且处理器由于内存不足而试图杀死您的应用程序...方式,这种错误会浪费你很多时间......祝你好运......

【讨论】:

  • 我同意你的最后一句话,这很糟糕。我花了过去 3 天的时间试图找到这个错误...我认为测试需要的时间比编写应用程序本身要长一些
猜你喜欢
  • 1970-01-01
  • 2014-04-19
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
相关资源
最近更新 更多