我的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方法中释放了每个已分配的对象。有什么想法吗?
答案 0 :(得分:1)
发布您的代码。
这绝对是一个内存管理问题。问题是“问题出在哪里?”要回答这个问题,我们需要检查以下内容:
你在“我已经完成了这个级别,让我们交换下一个”代码中你正在调用release这一事实表明了整体设计问题。使每个类的iVars的内存管理成为其访问者的责任,并且只使用访问器与它进行交互(甚至在类/实例中)。使用合成属性,这使得它很简单。这样您就不必担心保留/释放iVar的位置,因为它总是通过访问器进行管理。