0

我有一个基于导航的 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 (如在苹果文档中找到的),但这无济于事。

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

谢谢,马克。

4

2 回答 2

0

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

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

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

希望这可以帮助。

于 2010-08-04T10:44:44.017 回答
0

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

self.navItem = [[NavigationBarTitleItemViewController alloc] initWithNibName:@"NavigationBarTitleItem" bundle:nil];
于 2010-09-30T19:02:00.487 回答