无法释放viewcontroller

时间:2012-08-17 13:50:35

标签: release viewcontroller nszombie

我需要一些帮助来释放xcode中的控制器..不使用ARC ..从我的主委托控制器看一下这个简单的代码:

LoginViewController *login = [[LoginViewController alloc] init];
[window addSubview:login.view];
[window makeKeyAndVisible];
[login release];  // code runs if i comment out this line

如果我注释掉程序运行的最后一行。 程序在最后一行崩溃了...我放了一个僵尸,这是结果: 2012-08-17 09:43:02.193 dialer [238:707] * - [LoginViewController performSelector:withObject:withObject:]:消息发送到解除分配的实例0x186360

我如何追踪这一点,为什么这是因为我立即分配和释放所以这一点。它与保留等有关吗

1 个答案:

答案 0 :(得分:1)

登录控制器作为子视图添加然后释放,但addSubview方法不保留控制器(仅控制器.view),因此无法再使用它。

你必须释放它或者你会有泄漏,解决方案是在你的类中创建一个属性/ ivar并为其分配视图控制器(而不是局部变量),然后在dealloc中释放它。

我认为你缺少的是,[login release]语句有效地将loginViewController的保留计数减少到零,并且对象丢失/清理,这不是你想要的,因为你仍然需要它只要显示您的子视图。

所以你的父对象(主控制器,如果我正确理解你的例子)创建了loginController,将loginView添加为子视图(这是通过执行addSubview调用保留的),然后释放控制器,但你仍然需要它处理登录视图!所以解决方案是在主控制器中保留一个引用,以便在需要时保留它(直到你删除loginView,或者主控制器被取消分配)