【问题标题】:Is there a way to avoid errors when releasing an object while code is still running?有没有办法在代码仍在运行时释放对象时避免错误?
【发布时间】:2009-02-10 18:40:01
【问题描述】:

我有一个 UIView 子类,它会在调用 -drawRect: 时自行绘制。只需要一点时间,但在极端情况下,例如内存不足和去另一个视图控制器时删除实例,在对象被释放之前绘制函数不会完成。

我应该如何处理这个问题?释放会导致对 [self ...] 的任何调用抛出 EXC_BAD_ACCESS,绘图函数会执行此操作来确定如何绘制自身。

注意:

我主要使用框架来处理内存管理。问题在于 UIView 使用的 CATiledLayer 对 -drawRect: 的异步调用,这些调用在 UIView 发布之前进入。但是,由于它是异步的,-didReceiveMemoryWarning 在绘制的同时运行,导致视图在绘制中间被释放。

【问题讨论】:

  • 注意:我已经将它包装在一个通用的 try-catch 块中(NSException *),但 EXC_BAD_ACCESS 显然不是一个例外。

标签: cocoa-touch memory-management


【解决方案1】:

首先阅读 Apple 的内存管理规则:

Cocoa Memory Management Rules

底线:“处理”问题的方法是确保您管理您的对象和它们的内存使用正确。因解除分配而导致的崩溃不是要被困住的东西,而是您的应用程序中需要修复的完全错误。

【讨论】:

  • 我没有办法解决它。我已经阅读了文档,并且我主要使用该框架来处理内存管理。问题在于对象释放后从 CATiledLayer 对 drawRect 的异步调用。
  • 如果你得到一个 EXC_BAD_ACCESS 错误,那几乎 100% 是程序员的错。我建议您启用僵尸并以这种方式进行调试,以追踪您不应该释放的对象。
  • 我已经做到了。 UIView 是被释放的对象,就在它被绘制的中间。
  • 如果 UIView 是问题所在,那么很明显,您没有正确保留它或其子视图之一。虽然没有代码是完美的,甚至 Apple 的代码也不完美,但这听起来绝对像是程序员的错误,而不是 SDK/OS 中的错误。
  • 内存管理问题有时难以追踪。再次,启用僵尸并找出有问题的对象是什么(Google NSZombieEnabled 了解更多关于如何完成此操作的信息)。
【解决方案2】:

我认为这里的答案是:使用@synchronized

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多