1

我找不到问题出在哪里,但是这段代码正在崩溃。我是否过度释放任何对象?

settings = [[SettingsViewController alloc] initWithNibName:@"SettingsController" bundle:nil];
settings.hidesBottomBarWhenPushed = YES;

NSArray * arrayWithRootController = [[NSArray alloc] initWithObjects:settings, nil];
[(UINavigationController*)([self.tabBar.viewControllers lastObject])setViewControllers:arrayWithRootController];
[arrayWithRootController release];
[settings release];

如果我删除线

[settings release];

该应用程序不会崩溃。但我很确定它是正确的。问题可能出在其他地方吗?

有任何想法吗?非常感谢

4

1 回答 1

1

您在此片段中并没有过度释放,但显然有些地方是不对的。将根视图控制器添加到数组将保留它,但仅限于数组的生命周期。当数组死亡时,其中的所有对象也会被释放(我猜这里发生了什么)。

几件事要尝试:首先,确保将阵列放在您认为的位置:

[(UINavigationController*)([self.tabBar.viewControllers lastObject])setViewControllers:arrayWithRootController];

你期望[self.tabBar.viewControllers lastObject]成为什么?您确定这是您要分配新数组的位置吗?如果接收器无效,您的数组将不会保留在下一行中,这意味着视图控制器也将被释放。

我不熟悉您的架构,但您似乎正在将一组视图控制器分配给视图控制器。self.tabBar是一个导航控制器,你可以调用setViewControllers它。但是self.tabBar.viewControllers lastObject......好吧,大概这是一个视图控制器,但不一定是导航控制器,它可能不会响应 setViewControllers (在这种情况下它应该崩溃,除非它是 nil,我猜它可能是)。

最后,尝试使用 Instruments 工具 Zombies 来查看是否可以查明意外释放的来源。

于 2013-02-20T16:44:23.717 回答