我正在开发一个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,所以我应该发布它,对吧?如果有类似这样的东西,我觉得发布这个应用程序是不对的,我觉得它会失败。请让我知道你的想法。
答案 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?