2009-11-30 67 views
-1

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

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

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

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

上面写的方法有问题吗?或者错误在其他地方,也许在水平班?我在关卡中分配了一些UIImageView,但是我在release dealloc方法中释放了每个分配的对象。有任何想法吗?

+0

你可以发布更多的代码(最好在实际的代码块)吗?事件的基本顺序听起来很好,所以我猜这个问题在你的关卡类中。可能它的dealloc方法释放了其他地方仍在使用的东西? – walkytalky 2009-11-30 12:29:05

+0

好吧,事情的基本顺序听起来很可疑。请参阅下面的答案 - iVar的内存管理(以及访问iVar)应由其访问者处理,而不是在其他地方操作。我强烈怀疑设计问题。 OP确实需要发布他/她的代码。 – 2009-11-30 15:11:08

回答

1

发布您的代码。

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

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

事实上,你在你的“我完成了这个级别,让我们换下一个”代码中调用发布版本,这表明了一个总体设计问题。使每个类的iVars的内存管理成为其访问者的责任,并且只使用访问者与它进行交互(甚至可以在类/实例中)。通过综合属性,这使得它非常简单。这样,您不必担心保留/释放iVars的位置,因为它始终通过访问器进行访问。

+0

实际的代码很安静,我不会发布一切。只要产生错误,我想我会缩短它。如果你仔细检查,这将是一件乐事。我使用CG风格的C风格数组,它可能会导致崩溃吗? – Geri 2009-11-30 17:18:26

+0

回复:CGPoints + C数组,我不知道 - 你还没有发布你的代码。;-) – 2009-11-30 19:03:41

+0

重新思考整个设计模式是我真的很感激。我以前的问题只是关于这个:http://stackoverflow.com/questions/1769430/looking-for-concept-for-managing-game-level-views-level-selection-views-prefere – Geri 2009-11-30 19:31:55

相关问题