我每次都使用dealloc删除观察者,但只是面对这个描述我们可以使用viewWillDisapper而不是dealloc的link。
答案 0 :(得分:3)
选择是正确配对addObserver
/ removeObserver
来电。
如果您在某个addObserver
方法或init
方法中拨打viewDidLoad
,请拨打removeObserver
中的dealloc
。
如果您在addObserver
多次调用的地方致电viewWillAppear
,请拨打removeObserver
中的viewWillDisappear
。
重要的是正确的配对。
答案 1 :(得分:2)
关于KVO的一个关键问题是你必须匹配removeObserve和addObserver调用,你不能添加重复的观察者。这意味着您必须仔细考虑添加观察者的位置以及删除观察者的位置,以免违反这些限制。
如果你在viewDidLoad中添加它,它现在足以在dealloc中删除它(因为viewDidUnload不再被使用),但观察者可能在视图不可见时触发。如果您在仍在调用viewDidUnload的较旧操作系统上运行,这也可能会出现问题,因为您必须跟踪观察者何时到位以及何时不在。
您可以在viewDid / WillAppear中添加它,在这种情况下,您需要在viewDid / WillDisappear中将其删除。这通常比较清晰,因为通常会保证呼叫匹配。
答案 2 :(得分:2)
您引用的链接相对信息丰富且准确。
我用这些术语来思考:
a)VC是否需要在屏幕上进行通知?使用viewWillAppear / viewWillDisappear。
b)只要VC活着(但不一定在屏幕上),VC是否需要通知?使用init或viewDidLoad并在dealloc中删除。
我在ARC下打破了我的dealloc方法,并在预期时调用它们。但是没有调用viewDidUnload。