UIViewController中使用CFNotificationCenter强引用导致无法释放

7
我有一个视图控制器,一旦其父视图控制器从视图层次结构中移除并释放后,该视图控制器就永远不会被释放。在内存图中,它的每个实例看起来都是一样的,因为它只引用了CFNotificationCenter。似乎其他无关的、不同类别的视图控制器也都有相同的引用,但仍然可以被释放。该问题的视图控制器也没有任何NotificationCenter观察者,所以这对我来说毫无意义。
我附上了内存图的图片,并隐去了视图控制器的真实名称。我确信这是视图控制器的完整图表,并没有选择检查单个引用。

The confusing memory graph

这里发生了什么?为什么它不会被发布?
2个回答

6

您可以准确查看引用您的视图控制器的代码:

首先,为您的方案打开Malloc Stack Logging(使用Cmd-Shift-,打开方案编辑器)Xcode方案编辑器截图

然后,单击指向您的视图控制器的“malloc”块,并将鼠标悬停在Backtrace右侧以找到“展开”按钮以查看完整的堆栈跟踪: Xcode内存图调试器屏幕截图

然而,最有可能的罪魁祸首实际上并不是保留您的视图控制器的通知,因为该引用不强(否则它将是一个粗体箭头)。

Xcode内存图调试器不会显示对象是否保留自身。 在我的情况下,这是在我的viewDidLoad闭包中保留self的简单情况。


可能使用Instruments会更好。 - matt
3
检查malloc回溯显示问题:逃逸闭包中对self的强引用。 CFNotificationCenter只是一个误导,因此它在每个其他元素的回溯中。 - mac38478

0

我在我的项目中也遇到了这个问题。我发现,如果在调用CFNotificationCenterAddObserver和CFNotificationCenterRemoveObserver时将对象分配为nil,我仍然可以接收通知 - 而且在取消初始化之前添加为侦听器的对象不会出现保留问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接