我有一个基于导航的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中找到),但这没有用。
您是否有提示我可以采取哪些措施来防止此次崩溃?
谢谢, 标记
答案 0 :(得分:0)
我大约一个月前就有同样的错误,情况完全相同。它驱使我努力。
我发现我弹出的viewController根本没有被取消分配。我有一个自定义的UIButton子类添加到该视图,但是当第二个视图被推送时已经解除分配。所以当弹出时,UIButton不存在。
检查您正在弹回的视图,以确保您没有获得任何要解除分配的课程,或者在您不知情的情况下自动释放。
希望这有帮助。
答案 1 :(得分:0)
我终于找到了解决方案(非常简单)。 我必须通过其属性分配和初始化navItem,然后保留它:
self.navItem = [[NavigationBarTitleItemViewController alloc] initWithNibName:@"NavigationBarTitleItem" bundle:nil];