为什么要取消分配此对象?

时间:2009-11-20 04:55:14

标签: objective-c iphone exception memory-management

我正在开发一个iPhone应用程序,我正试图将视图推入导航控制器,我之前做了很多次,但是,我对这个特定的应用程序有一些问题。我有一个表视图,当用户选择一行时,新视图被推入控制器:

DataWrapper *row=[[self.rows objectAtIndex:[indexPath section]] objectAtIndex:[indexPath row]];
DataViewController *nextController=[[DataViewController alloc] initWithNibName:@"Data" bundle:[NSBundle mainBundle]];
[nextController setInfo:row];
[nextController setRow:[indexPath row]];
[nextController setParent:self];
[self.navigationController pushViewController:nextController animated:YES];
[nextController release];

它很好,直到用户点击后退按钮,我得到一个异常,并使用NSZombieEnabled得到这个:

-[DataViewController respondsToSelector:]: message sent to deallocated instance 0x4637a00

所以我试图删除[nextController release],事实上它有效,但为什么????我分配了nextController,所以我应该发布它,对吧?如果有类似这样的东西,我觉得发布这个应用程序是不对的,我觉得它会失败。请让我知道你的想法。

5 个答案:

答案 0 :(得分:5)

导航控制器未保留您的nextController。如果您释放它,那么因为只有一个init/release对,该对象将被释放。稍后当navigationController尝试向其发送消息时,您会收到错误。

这也是移除[nextController release]解决问题的原因。

你是对的,如果你分配了,你应该释放它。但是,只有 你的应用程序完成之后,而不是之前的

有些对象几乎会在应用程序的生命周期内保持分配状态,所以不要觉得太糟糕。

答案 1 :(得分:0)

我猜我[self.navigationController]正在返回nil,因为如果它不是nil,它会保留您的对象。由于您的对象未被保留,因此似乎没有对象试图保留它,表明navigationController属性为空。

答案 2 :(得分:0)

您的导航控制器是否可能以某种方式被解除分配,导致视图控制器也被释放?您可以在推送nextController之前保留导航控制器来测试它。

答案 3 :(得分:0)

出于调试目的,我将覆盖DataViewController类中的-dealloc,并在其上设置断点。

答案 4 :(得分:0)

但它似乎适用于:

DetailViewController *controller = [[DetailViewController alloc] initWithNibName:@"SomeView" bundle:nil]; 

controller.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self presentModalViewController: controller animated:NO];

[controller release];

那么,为什么它不能用于pushViewController?