UIViewController 未释放
Posted
技术标签:
【中文标题】UIViewController 未释放【英文标题】:UIViewController not deallocated 【发布时间】:2014-02-01 18:18:41 【问题描述】:我遇到这个问题已经有一段时间了,并尝试了几种方法来避免它,但现在我决定一劳永逸地解决它:)
我有一个聊天视图控制器,它使用 KVO 观察一个 NSSet,ChatVC 有一个 UITableView,每次将新的 ChatMessage 插入 NSSet 时,它也会作为 UITableViewCell 添加到 tableview。
现在,我的问题不在于观察,我猜它与内存管理有关。 在我的 ChatVC 中,方法 dealloc 永远不会被调用,因此 vc 始终在后台观察该 NSSet 对象。
我已尝试在 viewWillDisappear 上手动删除观察者,但 ChatVC 仍在后台。
使用 Instruments 对其进行分析向我表明,它实际上来自导致 ChatVC 的 pushViewController:
MZChatViewController* chatViewController = [[MZChatViewController alloc] initWithNibName:@"MZChatViewController" bundle:nil];
chatViewController.shouldShowIndetermineConnectingIndicator = showIndicator;
// instruments shows 100% on this row
[self.navigationController pushViewController:chatViewController animated:animated];
chatViewController = nil;
在这里稍作搜索,谷歌实际上没有给我任何帮助,我已经通过了我在那个 VC 中的所有代码,并且真的努力寻找一个保留循环,它也可能导致这个没有释放问题,但什么也没找到。
PS。 Xcode 5、ios 7 SDK、ARC
已解决: 显然它与 pushViewController:animated: 方法无关,Instruments 只是将此点标记为保留循环的原因,因为它正在触发一个在 viewDidLoad 处运行的 NSTimer。 因此,在 viewWillDisappear 中使该计时器无效解决了它。
【问题讨论】:
不,在我使用的唯一块中,我在内部使用了 __weak 引用。 幽默我。如果您要保留观察者对象(作为实例变量),请在删除观察后在viewWillDisappear
中释放它(通过将该实例变量设置为 nil),看看是否能解决问题。
实际上我找到了(我认为)主要原因。我正在设置一个覆盖默认设置器的属性(当然首先要做_object = object)。当我评论这一行时,VC 正在解除分配。这个属性是非原子强的,所以我不知道为什么它会取消释放:/
FIXED! 这是一个 NSTimer,我忘记在 viewWillDisappear 上使其无效...谢谢!
是的,请参阅我书中对 NSTimer 和保留周期的讨论:apeth.com/iOSBook/…(在该部分的末尾)
【参考方案1】:
虽然这不是这里的问题,但也许这会帮助遇到与解除分配 UIViewControllers 类似问题的其他人。
我们的 UIViewController 没有被释放,因为自定义委托属性持有强引用。
【讨论】:
以上是关于UIViewController 未释放的主要内容,如果未能解决你的问题,请参考以下文章
释放 UIPageViewController 中未使用的页面
CoreData 数据到 UIViewController 中的 UITableView?
为啥 UIPopoverController 不是 UIViewController 的子类?