UITableViewController已取消分配

时间:2011-07-15 15:15:11

标签: objective-c ios

我的代码有一个奇怪的问题:

MembersDetailViewController *m = [[MembersDetailViewController alloc]
initWithNibName:@"MembersDetailViewController" bundle:nil];
[m updateDataSource:[self.data objectAtIndex:[indexPath row]]];
[self.navigationController pushViewController:m animated:YES];
[m release];

在我的MembersListTableViewController控制器中的tableView didSelectRowAtIndexPath中调用此代码。 MembersDetailViewController可以打开另一个视图来显示地图:

MapViewController *mapViewController = [[MapViewController alloc] 
initWithNibName:@"MapViewController" bundle:nil];
mapViewController.delegate = self;
mapViewController.latitude = @"54.5944504";//self.latitude;
mapViewController.longitude = @"-5.6592376";//self.longitude;

[mapViewController setModalTransitionStyle:UIModalTransitionStylePartialCurl];

[self presentModalViewController:mapViewController animated:YES];
[mapViewController release];

问题是当MapViewController被解除并且在MemberDetailViewController上按下后退按钮时,我收到以下错误消息:

-[MembersDetailViewController retain]: message sent to deallocated instance 0x51663e0

如果我发表评论[m发布]那么一切正常。如果没有调用MapViewController,一切都还可以。我不明白为什么会这样?我一直认为如果我分配init然后我需要发布?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

你确实需要释放m,但在这样做时你放弃了该视图控制器的所有权。一段时间没关系,因为你已将它推到导航堆栈上,因此导航控制器会保留它。但是,当您点击“返回”按钮时,导航控制器将其从堆栈中弹出并释放它,此时它被释放,因为没有其他人拥有它。如果在此之后再次引用它,您将收到类似于您所描述的错误。

所以......如果你需要在上面的方法中引用m指向的视图控制器,你可能想在表视图控制器中为它创建一个“retain”属性并设置在您发布m之前,它会m。一旦不再需要详细视图控制器,请确保将该属性设置为nil - 这将导致它最终被释放和释放。

答案 1 :(得分:0)

感谢您的回复。经过大量的调试后我终于找到了问题。我正在使用委托来解除模态视图控制器,并且在dealloc方法中我释放并且将其指向它,指向MembersDetailViewController。所以这是jtbandes评论所建议的过度释放的情况。