iOS正确的方法来删除观察者

时间:2014-04-22 16:01:49

标签: ios nsnotificationcenter

我每次都使用dealloc删除观察者,但只是面对这个描述我们可以使用viewWillDisapper而不是dealloc的link

3 个答案:

答案 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。