我有一段时间没有这个问题,并尝试了几种方法来避免它,但现在我决定一劳永逸地修复它:)
我有一个聊天视图控制器,它使用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中使该计时器无效解决了它。
虽然这不是问题所在,但这可能会帮助遇到类似问题的其他人解除分配UIViewControllers。
我们的UIViewController没有被释放,因为自定义委托属性拥有强大的引用。