【问题标题】:Cannot allocate new instance of UIView subclass after deallocating解除分配后无法分配 UIView 子类的新实例
【发布时间】:2009-11-30 11:02:48
【问题描述】:

我的 viewController 类中有一个实例变量 *TangramLevel(:UIView) currentLevel;,我在开始时分配了一个实例(它是 retainCount 1)。我将它附加到视图 [self.view addSubview:currentLevel]; (retainCount 2)。

当关卡完成时,通知控制器,控制器将其从视图中移除[currentLevel removeFromSuperview]; (retainCount 1),并释放分配的实例 - [currentLevel release] ; - 释放它(retainCount 0 = 调用 dealloc)。

然后在下一行,controller 想要分配/addSubview 一个具有另一个级别数据的新级别实例,但应用程序崩溃(EXEC BAD ACCESS)。

如果我在 removeFromSuperview 之后不释放 currentLevel,则应用程序可以工作,但是我在内存中留下了一个未使用的关卡实例,这也是一个问题(主要问题本身)。

我上面写的方法有bug吗?或者bug在别处,可能在关卡类?我在关卡中分配了一些 UIImageView,但我在级别 dealloc 方法中释放了每个分配的对象。有什么想法吗?

【问题讨论】:

  • 你能发布更多的代码吗(最好是在实际的代码块中)?事件的基本顺序听起来不错,所以我猜问题出在您的关卡类中。可能它的 dealloc 方法释放了其他地方仍在使用的东西?
  • 嗯,事情的基本顺序听起来很可疑。请参阅下面的答案 - iVar 的内存管理(以及对 iVar 的访问)应由其访问器处理,而不是在其他地方进行操作。我强烈怀疑是设计问题。 OP 确实需要发布他/她的代码。

标签: iphone objective-c xcode memory-management


【解决方案1】:

发布您的代码。

这绝对是内存管理问题。问题是“问题出在哪里?”要回答这个问题,我们需要检查以下内容:

  1. 您的“currentLevel”iVar 处理代码(您是否使用了综合属性等)。发布它。
  2. 如何将视图分配给 currentLevel?
  3. 具体是在哪里发布的?
  4. 您的视图的 dealloc 是如何实现的(您发布了什么以及如何发布)?
  5. 是否有任何其他代码保留/释放此视图或与之相关的任何内容?

您在“我已完成此级别,让我们换入下一个”代码中调用 release 的事实表明存在整体设计问题。让每个类的 iVar 的内存管理由其访问器负责,并且仅使用访问器与其交互(即使在类/实例中)。有了合成的属性,这使它变得非常简单。这样您就不必担心在哪里保留/释放 iVar,因为它总是通过访问器汇集。

【讨论】:

  • 实际代码很长,我就不贴了。我想我会缩短它,只要它产生错误。如果你能检查一下,那将是一种乐趣。我使用 C 风格的 CGPoints 数组,它会导致崩溃吗?
  • Re: CGPoints + C 数组,我不知道 - 你还没有发布你的代码。 ;-)
  • 重新思考整个设计模式是我非常感激的事情。我之前的问题就是这样:stackoverflow.com/questions/1769430/…
  • 你能看一下吗?这是“自我回答”,也许我错了。
猜你喜欢
  • 1970-01-01
  • 2013-03-24
  • 2019-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
相关资源
最近更新 更多