带有 CFNotificationCenter 强引用的 UIViewController 不会释放
UIViewController with CFNotificationCenter strong reference won't release
我有一个视图控制器,一旦它的父视图控制器从视图层次结构中删除并释放,它就永远不会被释放。它在内存图中的每个实例看起来都一样,因为它有一个对 CFNotificationCenter
的引用。似乎不同 class 的其他不相关的视图控制器都具有相同的引用,但仍被释放。有问题的视图控制器也没有任何 NotificationCenter
观察者,所以这对我来说毫无意义。
我附上了一张内存图的图像,其中删除了视图控制器的真实名称。我也确定这是视图控制器的完整图表,我没有选择检查单个参考。
这里发生了什么?为什么不发布?
您可以准确地看到哪些代码引用了您的视图控制器:
首先,为您的方案打开 Malloc 堆栈日志记录(使用 Cmd-Shift-, 打开方案编辑器)
然后,单击指向您的视图控制器的“malloc”块,并将鼠标悬停在 Backtrace 的右侧以找到“展开”按钮以查看完整的堆栈跟踪:
然而,最有可能的罪魁祸首实际上并不是保留您的视图控制器的通知,因为引用不强(否则它将是 粗体箭头)。
Xcode 内存图调试器不会向您显示对象何时保留自身。在我的例子中,这是一个简单的例子,在我的 viewDidLoad
.
的闭包中保留 self
我的项目也有这个问题。而且我发现,如果我在调用 CFNotificationCenterAddObserver 和 CFNotificationCenterRemoveObserver 时将对象分配给 nil,我仍然可以收到通知 - 并且在取消初始化对象时没有保留问题,我之前将其添加为侦听器。
我有一个视图控制器,一旦它的父视图控制器从视图层次结构中删除并释放,它就永远不会被释放。它在内存图中的每个实例看起来都一样,因为它有一个对 CFNotificationCenter
的引用。似乎不同 class 的其他不相关的视图控制器都具有相同的引用,但仍被释放。有问题的视图控制器也没有任何 NotificationCenter
观察者,所以这对我来说毫无意义。
我附上了一张内存图的图像,其中删除了视图控制器的真实名称。我也确定这是视图控制器的完整图表,我没有选择检查单个参考。
这里发生了什么?为什么不发布?
您可以准确地看到哪些代码引用了您的视图控制器:
首先,为您的方案打开 Malloc 堆栈日志记录(使用 Cmd-Shift-, 打开方案编辑器)
然后,单击指向您的视图控制器的“malloc”块,并将鼠标悬停在 Backtrace 的右侧以找到“展开”按钮以查看完整的堆栈跟踪:
然而,最有可能的罪魁祸首实际上并不是保留您的视图控制器的通知,因为引用不强(否则它将是 粗体箭头)。
Xcode 内存图调试器不会向您显示对象何时保留自身。在我的例子中,这是一个简单的例子,在我的 viewDidLoad
.
self
我的项目也有这个问题。而且我发现,如果我在调用 CFNotificationCenterAddObserver 和 CFNotificationCenterRemoveObserver 时将对象分配给 nil,我仍然可以收到通知 - 并且在取消初始化对象时没有保留问题,我之前将其添加为侦听器。