我遇到这个问题已有一段时间,并尝试了几种方法来避免它,但现在我决定一劳永逸地修复它:)
我有一个聊天视图控制器,它使用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;
在这里和Google进行一点搜索实际上并没有给我任何帮助,我已经遍历了该VC中的所有代码,并确实努力寻找了一个保留周期,该周期也可能导致此无解除分配问题,但未发现任何问题。
PS。
Xcode 5,iOS 7 SDK,ARC
解决了:
显然,这与pushViewController:animated:方法无关,Instruments只是将该位置标记为保留周期的原因,因为它触发了一个在viewDidLoad上运行的NSTimer。
因此,使viewWillDisappear中的计时器无效即可解决该问题。
最佳答案
尽管这不是问题所在,但这可能会帮助其他在分配UIViewControllers时遇到类似问题的人。
我们的UIViewController未被释放,因为自定义委托属性拥有强大的引用。