【发布时间】: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