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

Leg*_*10n 4 iphone memory-management exception objective-c

我正在开发一个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];
Run Code Online (Sandbox Code Playgroud)

它很顺利,直到用户点击后退按钮,我得到一个例外,并使用NSZombieEnabled得到这个:

-[DataViewController respondsToSelector:]: message sent to deallocated instance 0x4637a00
Run Code Online (Sandbox Code Playgroud)

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

fre*_*ace 5

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

这也是删除[nextController release]修复问题的原因.

你是对的,如果你分配了,你应该释放它.但是,只有您的应用程序完成之后才会发出警告,而不是之前.

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

  • 我认为干净的方法是在` - viewDidLoad`方法中分配`DataViewController`,然后在` - viewDidUnload`方法中再次释放它. (3认同)