解除分配后无法分配UIView子类的新实例

时间:2009-11-30 11:02:48

标签: iphone objective-c xcode memory-management

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

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

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

如果我在removeFromSuperview之后没有释放currentLevel,那么appliaction会起作用,但是我在内存中留下了一个未使用的级别实例,这也是一个问题(主要问题本身)。

我上面写的方法有没有错误?或者错误在其他地方,可能在关卡中?我在关卡中分配了一些UIImageView,但是我在dealloc方法中释放了每个已分配的对象。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

发布您的代码。

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

  1. 您的“currentLevel”iVar处理代码(您是否使用了合成属性等)。发布。
  2. 您如何将视图分配给currentLevel?
  3. 你在哪里发布这个,特别是?
  4. 您的视图是如何实现的(您发布了什么以及如何发布)?
  5. 是否有其他代码可以保留/释放此视图或与其相关的任何内容?
  6. 你在“我已经完成了这个级别,让我们交换下一个”代码中你正在调用release这一事实表明了整体设计问题。使每个类的iVars的内存管理成为其访问者的责任,并且只使用访问器与它进行交互(甚至在类/实例中)。使用合成属性,这使得它很简单。这样您就不必担心保留/释放iVar的位置,因为它总是通过访问器进行管理。