Ios 这个代码发布过度了吗?

Ios 这个代码发布过度了吗?,ios,cocoa-touch,release,Ios,Cocoa Touch,Release,我找不到问题所在,但这段代码正在崩溃。我是否过度释放任何物体 settings = [[SettingsViewController alloc] initWithNibName:@"SettingsController" bundle:nil]; settings.hidesBottomBarWhenPushed = YES; NSArray * arrayWithRootController = [[NSArray alloc] initWithObjects:settings, nil]

我找不到问题所在,但这段代码正在崩溃。我是否过度释放任何物体

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];
应用程序不会崩溃。但我很肯定这是正确的。问题可能在另一个地方吗


有什么想法吗?非常感谢

您在这段代码中没有过度删节,但显然有些地方不对劲。将根视图控制器添加到阵列将保留它,但仅在阵列的生命周期内保留它。当数组死亡时,数组中的所有对象也被释放(我猜这里发生了什么)

有两件事可以尝试: 首先,确保将阵列放置在您认为的位置:

[(UINavigationController*)([self.tabBar.viewControllers lastObject])setViewControllers:arrayWithRootController];
您希望
[self.tabBar.viewControllers lastObject]
是什么?您确定要在此处分配新阵列吗?如果接收器无效,阵列将不会保留在下一行中,这意味着视图控制器也将被释放

我不熟悉您的体系结构,但您似乎正在将视图控制器数组分配给视图控制器
self.tabBar
是一个导航控制器,您可以在其上调用
setViewControllers
。但是
self.tabBar.viewControllersLastObject
。。。很可能这是一个视图控制器,但不一定是一个导航控制器,它可能不会响应SetViewController(在这种情况下,它应该崩溃,除非它是nil,我猜它可能是)


最后,试着使用工具Zombies,看看是否可以确定意外发布的来源。

您在这段代码中没有过度扩展,但显然有些地方不正确。将根视图控制器添加到阵列将保留它,但仅在阵列的生命周期内保留它。当数组死亡时,数组中的所有对象也被释放(我猜这里发生了什么)

有两件事可以尝试: 首先,确保将阵列放置在您认为的位置:

[(UINavigationController*)([self.tabBar.viewControllers lastObject])setViewControllers:arrayWithRootController];
您希望
[self.tabBar.viewControllers lastObject]
是什么?您确定要在此处分配新阵列吗?如果接收器无效,阵列将不会保留在下一行中,这意味着视图控制器也将被释放

我不熟悉您的体系结构,但您似乎正在将视图控制器数组分配给视图控制器
self.tabBar
是一个导航控制器,您可以在其上调用
setViewControllers
。但是
self.tabBar.viewControllersLastObject
。。。很可能这是一个视图控制器,但不一定是一个导航控制器,它可能不会响应SetViewController(在这种情况下,它应该崩溃,除非它是nil,我猜它可能是)


最后,尝试使用工具Zombies来确定是否可以确定意外释放的来源。

可以发布崩溃的详细信息吗?这个错误将非常有用。@user1394965您错了!iOS6不会改变内存管理中的任何内容。我相信你把它和自动参考计数弄混了。(顺便说一句,iOS4/5中也提供了这一功能!)如果UINavigationController保留其视图控制器,则此代码看起来是正确的。通过使用NSArray factory方法
-arrayWithObject:
,您可以简化一些事情,因为结果是自动释放。ViewController是根据应用程序定义为复制的属性。这是折磨您自己的好理由,还是您只是想了解弧前时代?您可以发布崩溃的详细信息吗?这个错误将非常有用。@user1394965您错了!iOS6不会改变内存管理中的任何内容。我相信你把它和自动参考计数弄混了。(顺便说一句,iOS4/5中也提供了这一功能!)如果UINavigationController保留其视图控制器,则此代码看起来是正确的。通过使用NSArray工厂方法
-arrayWithObject:
可以简化一些事情,因为结果是自动删除。viewControllers是一个根据应用程序定义为复制的属性是否有充分的理由折磨你自己,或者你只是想了解弧前时代?是的,我把数组放在了正确的位置,我尝试添加另一个视图控制器而不是“设置”,并且没有崩溃。设置对象[UITableView(UITableViewInternal)\u createPreparedCellForGlobalRow:withIndexPath:]中的问题是100%确定的,这是对象的引用计数达到-1的方法。看起来您在XIB中创建了一些接口。你有UITableViewController对象吗?关联的属性是否确实强/保留?是的,我将数组放置在正确的位置,我尝试添加另一个视图控制器而不是“设置”,并且没有崩溃。设置对象[UITableView(UITableViewInternal)\u createPreparedCellForGlobalRow:withIndexPath:]中的问题是100%确定的,这是对象的引用计数达到-1的方法。看起来您在XIB中创建了一些接口。你有UITableViewController对象吗?相关财产是否确实强大/保留?