UIViewController自定义titleView崩溃的应用程序

时间:2010-08-04 10:39:49

标签: iphone uiviewcontroller crash titleview

我有一个基于导航的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(在apple docs中找到),但这没有用。

您是否有提示我可以采取哪些措施来防止此次崩溃?

谢谢, 标记

2 个答案:

答案 0 :(得分:0)

我大约一个月前就有同样的错误,情况完全相同。它驱使我努力。

我发现我弹出的viewController根本没有被取消分配。我有一个自定义的UIButton子类添加到该视图,但是当第二个视图被推送时已经解除分配。所以当弹出时,UIButton不存在。

检查您正在弹回的视图,以确保您没有获得任何要解除分配的课程,或者在您不知情的情况下自动释放。

希望这有帮助。

答案 1 :(得分:0)

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

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