UITableViewController 被释放

Posted

技术标签:

【中文标题】UITableViewController 被释放【英文标题】:UITableViewController deallocated 【发布时间】:2011-07-15 15:15:11 【问题描述】:

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

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 release],那么一切正常。如果没有调用 MapViewController,一切都还可以。我不明白为什么会这样?我总觉得如果分配 init 就需要释放?

任何帮助将不胜感激。

【问题讨论】:

你所拥有的似乎还不错。你确定它没有在其他地方过度发布吗? 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

感谢您的回复。经过大量的调试,我终于找到了问题所在。我正在使用一个委托来关闭模式视图控制器,并且在那个 dealloc 方法中我释放并取消了它,它指向了 MembersDetailViewController。因此,正如 jtbandes 评论所建议的那样,这是一个过度释放的情况。

【讨论】:

以上是关于UITableViewController 被释放的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewController 中的 iPhone 奇怪行为

无法在 dealloc 中释放 NSFetchedResultsController

UIView 帧发送到释放的实例

UITableViewController 的最后一行被截断

添加到 UITableViewController 时,SwiftUI 视图大小被破坏

当我们使用 UITableViewController 的子类处理表委托时,如何使 viewWillAppear 被调用?