【问题标题】:UIViewController custom titleView crashes appUIViewController 自定义 titleView 崩溃应用
【发布时间】:2010-10-01 03:02:00
【问题描述】:

我有一个基于导航的 iPhone 应用程序。 当您按下 tableview 中的一个单元格时,一个新的 UIViewController 被推送到导航堆栈。在这个视图控制器中,我在 viewDidLoad 方法中设置了一个自定义 titleView:

- (void)viewDidLoad {
    [super viewDidLoad];

    // Setup custom navigation title
    [self setTitle:@"Mediaportal"];
    navItem = [[NavigationBarTitleItemViewController alloc] initWithNibName:@"NavigationBarTitleItem" bundle:nil];
    [navItem setTitle:[theServer name]];
    [navItem setSubTitle:@""];
    [self.navigationItem setTitleView:navItem.view];

…
}

一旦我切换回 RootViewController:

[self.navigationController popToRootViewControllerAnimated:YES];

应用崩溃并出现以下错误 (NSZombieEnabled=YES):

*** -[CALayer retain]: message sent to deallocated instance 0x5a5fd80

据我所知,RootViewController 仍然尝试访问自定义的 titleView,它已被第二个视图控制器释放。一旦我在我的代码中注释掉自定义 titleView 部分,该应用程序就会工作。 在释放第二个 ViewController 之前,我尝试将 navigationItem.titleView 设置为 nil(在苹果文档中找到),但这没有帮助。

你有什么提示我可以做些什么来防止这次崩溃吗?

谢谢, 标记。

【问题讨论】:

  • 你到底在哪里发布 navItem?
  • 在第二个视图控制器的dealloc方法中。

标签: iphone uiviewcontroller crash titleview


【解决方案1】:

大约一个月前我遇到了同样的错误,完全一样的情况。它把我逼疯了。

我发现我弹出的 viewController 根本没有被释放。我在该视图中添加了一个自定义 UIButton 子类,但是在推送第二个视图时该子类已被释放。所以当弹回来时,UIButton 不存在。

检查您要返回的视图,以确保您没有任何要释放的类,或者在您不知情的情况下被自动释放。

希望这会有所帮助。

【讨论】:

  • 嗨,Bongeh,感谢您的回答,但我认为我遇到了不同的问题。当我没有将自定义标题视图添加到子视图控制器中的 navigationItem 时,不会发生崩溃。因此,我很确定问题不在于根视图控制器中的某些已释放对象?还是我错过了什么?
  • 没有看到更多代码或复制问题的简化项目,我只能对问题进行猜测。显然,我们知道某些不应该被释放的东西正在被释放。 NavigationBarTitleItemViewController 中是否有正在释放的类或对象,或者是自动释放对象?
【解决方案2】:

我终于找到了解决方案(一个非常简单的解决方案)。 我必须通过它的属性分配和初始化 navItem 然后它被保留:

self.navItem = [[NavigationBarTitleItemViewController alloc] initWithNibName:@"NavigationBarTitleItem" bundle:nil];

【讨论】:

    猜你喜欢
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 2011-08-19
    • 1970-01-01
    相关资源
    最近更新 更多