【问题标题】:iOS Programming: 'super dealloc' crashes appiOS 编程:“super dealloc”使应用程序崩溃
【发布时间】:2011-07-05 07:09:53
【问题描述】:

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

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

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

当我从该视图返回到主视图时,应用程序崩溃(大约需要一分钟左右,在此之前一切正常,但它总是会发生),并出现自动释放池错误。

当我评论 [root release] 应用程序保持活动状态时,我遇到了另一个问题:在我第二次访问视图(不是第一次!)时,当调用在视图中放置弹出框的方法时,应用程序崩溃,我收到以下错误:

'无法从没有窗口的视图中呈现弹出窗口。'

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

【问题讨论】:

    标签: ios ipad autorelease dealloc popover


    【解决方案1】:

    这行有点令人费解:

    displayTheMapViewController=root;
    

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

    self.displayTheMapViewController=root;
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        至于当你不释放 root 并重新进入视图时会发生什么,我怀疑这与 DisplayTheMapViewController_iPad 的内部有关,一旦你有了它的第二个实例。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-07-10
          • 1970-01-01
          • 1970-01-01
          • 2011-11-17
          • 1970-01-01
          • 1970-01-01
          • 2012-03-27
          相关资源
          最近更新 更多