我有一个视图控制器,一旦其父视图控制器从视图层次结构中移除并释放后,该视图控制器就永远不会被释放。在内存图中,它的每个实例看起来都是一样的,因为它只引用了CFNotificationCenter。似乎其他无关的、不同类别的视图控制器也都有相同的引用,但仍然可以被释放。该问题的视图控制器也没有任何NotificationCenter观察者,所以这对我来说毫无意义。我附上了内存图的图片,并隐去了视图控制器的真实名称。我确信这是视图控制器的完整图表,并没有选择检查单个引用。 这里发生了什么?为什么它不会被发布?
您可以准确查看引用您的视图控制器的代码: 首先,为您的方案打开Malloc Stack Logging(使用Cmd-Shift-,打开方案编辑器) 然后,单击指向您的视图控制器的“malloc”块,并将鼠标悬停在Backtrace右侧以找到“展开”按钮以查看完整的堆栈跟踪: 然而,最有可能的罪魁祸首实际上并不是保留您的视图控制器的通知,因为该引用不强(否则它将是一个粗体箭头)。 Xcode内存图调试器不会显示对象是否保留自身。 在我的情况下,这是在我的viewDidLoad闭包中保留self的简单情况。
我在我的项目中也遇到了这个问题。我发现,如果在调用CFNotificationCenterAddObserver和CFNotificationCenterRemoveObserver时将对象分配为nil,我仍然可以接收通知 - 而且在取消初始化之前添加为侦听器的对象不会出现保留问题。
self
的强引用。CFNotificationCenter
只是一个误导,因此它在每个其他元素的回溯中。 - mac38478