我遇到这个问题已经有一段时间了,并尝试了几种方法来避免它,但现在我决定一劳永逸地解决它
我有一个聊天 View Controller ,它使用 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 中使该计时器无效解决了它。
Best Answer-推荐答案 strong>
虽然这不是这里的问题,但也许这会帮助遇到类似问题的其他人解除分配 UIViewControllers。
我们的 UIViewController 没有被释放,因为自定义委托(delegate)属性持有强引用。
关于ios - UIViewController 未释放,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/21501736/
|