iOS编程:'超级dealloc'崩溃应用程序

时间:2011-07-05 07:09:53

标签: ios ipad autorelease dealloc popover

这是我第一次在这个网站上提问。作为业余开发人员,我总是在这个网站上找到我的问题的答案,但我找不到我当前的问题。

在我的iPad应用程序中,我从rootView调用一个新的UIViewController:

DisplayTheMapViewController_iPad *root = [[DisplayTheMapViewController_iPad alloc] init];
displayTheMapViewController=root;
[[self navigationController] pushViewController:displayTheMapViewController animated:YES];
[root release];

当我从这个视图返回主视图时,应用程序崩溃(需要一分钟左右,直到那时一切正常,但总是会发生),并发生自动释放池错误。

当我发表评论[root release]时,应用程序仍处于活动状态,但后来我遇到了另一个问题:在第二次访问视图时(不是第一次!)当调用一个方法将一个popover放在视图中时,应用程序崩溃,我收到以下错误:

'弹出窗口无法从没有窗口的视图中显示。'

我必须做错事。我提前感谢你的任何建议。

3 个答案:

答案 0 :(得分:1)

这条线有点令人费解:

displayTheMapViewController=root;

我猜测displayTheMapViewController是一个实例变量?如果是这样,你要为它分配root,但是你没有保留root。当该控制器从导航堆栈弹出时,导航控制器将释放它,导致它被解除分配,因为没有其他任何东西保留它。然后displayTheMapViewController将指向无效对象。也许你想说:

self.displayTheMapViewController=root;

如果将displayTheMapViewController 属性设置为保留其内容,则可以防止上面的悬空指针问题。

答案 1 :(得分:0)

检查您忘记释放已分配对象的DisplayTheMapViewController_iPad类顶部。

答案 2 :(得分:0)

您没有发布足够的代码来完全诊断问题,但我建议您检查以下行:displayTheMapViewController = root;。由于您未保留root,因此在从导航控制器中删除视图控制器后,displayTheMapViewController将悬空。

关于当你不释放root并重新进入视图时会发生什么,我怀疑这是DisplayTheMapViewController_iPad的内部结构,只要你有第二个实例。