移除对象后观察者仍在分派 table
Observers remaining in dispatch table after object removed
有点像新手问题,如果我遗漏了一些基本概念,请原谅我...
我在 window 中有一个视图控制器,它包含多个 NSTableView,每个 NSTableView 都有通过 addObserver 添加的各种关联观察器。这些工作正常并且符合预期,通知会发送到每个正确的 table 视图。但是,如果我关闭 window,然后打开一个新的 window(相同类型),发布的通知将发送到 window 的 table 视图之前关闭。
我的印象是,从 macOS 10.11 开始,观察者不必明确删除,我认为这会在原始 window 关闭时发生……除非我遗漏了一些基本的东西关于关闭 windows。目前,当用户关闭 window 并且 window 只是从屏幕上消失时,我没有做任何特别的事情。即使在 window 关闭后,在我的 viewDidLoad 方法中创建的视图是否仍然存在?或者我不需要在诸如 viewWIllDisappear?
的方法中显式处理这些视图
谢谢!
即使您添加为观察者的对象被处置,观察者也不会被处置。根据官方文档,您必须将每个 addObserver
与相应的 removeObserver
配对。对于 NotificationCenter
和 KVO 都是如此。顺便说一下,将对象添加为观察者不会增加其所有者,因此在正确的内存管理下,左观察者会导致 运行 次崩溃——这就是为什么需要配对的 removeObserver(如果在这种情况下没有崩溃,则意味着有泄漏)。
执行此操作的位置取决于使用情况。如果您在 viewWillAppear
中添加观察者,那么最好在 viewWillDisappear
中将其删除,如果您在创建时添加,则应在 deinit
中删除它
有点像新手问题,如果我遗漏了一些基本概念,请原谅我...
我在 window 中有一个视图控制器,它包含多个 NSTableView,每个 NSTableView 都有通过 addObserver 添加的各种关联观察器。这些工作正常并且符合预期,通知会发送到每个正确的 table 视图。但是,如果我关闭 window,然后打开一个新的 window(相同类型),发布的通知将发送到 window 的 table 视图之前关闭。
我的印象是,从 macOS 10.11 开始,观察者不必明确删除,我认为这会在原始 window 关闭时发生……除非我遗漏了一些基本的东西关于关闭 windows。目前,当用户关闭 window 并且 window 只是从屏幕上消失时,我没有做任何特别的事情。即使在 window 关闭后,在我的 viewDidLoad 方法中创建的视图是否仍然存在?或者我不需要在诸如 viewWIllDisappear?
的方法中显式处理这些视图谢谢!
即使您添加为观察者的对象被处置,观察者也不会被处置。根据官方文档,您必须将每个 addObserver
与相应的 removeObserver
配对。对于 NotificationCenter
和 KVO 都是如此。顺便说一下,将对象添加为观察者不会增加其所有者,因此在正确的内存管理下,左观察者会导致 运行 次崩溃——这就是为什么需要配对的 removeObserver(如果在这种情况下没有崩溃,则意味着有泄漏)。
执行此操作的位置取决于使用情况。如果您在 viewWillAppear
中添加观察者,那么最好在 viewWillDisappear
中将其删除,如果您在创建时添加,则应在 deinit