【发布时间】:2014-04-22 16:01:49
【问题描述】:
我每次都使用 dealloc 来删除观察者,但只是遇到了这个link,它描述了我们可以使用 viewWillDisapper 而不是 dealloc。
【问题讨论】:
我每次都使用 dealloc 来删除观察者,但只是遇到了这个link,它描述了我们可以使用 viewWillDisapper 而不是 dealloc。
【问题讨论】:
选择是正确配对addObserver/removeObserver 调用。
如果你在一个被调用过的地方调用addObserver,比如一些init方法或viewDidLoad,那么在dealloc中调用removeObserver。
如果您在像viewWillAppear 这样被多次调用的地方调用addObserver,则在viewWillDisappear 中调用removeObserver。
重要的是正确的配对。
【讨论】:
viewWillDisappear 中的观察者时存在内存问题。正如我所说,如果您从viewWillAppear 调用addObserver,则只能从viewWillDisappear 调用removeObserver。如果这不能满足您的需求,则不要在这两种方法中设置/删除观察者。使用适合您需要的任何一对。
关于 KVO 的一个关键点是您必须匹配 removeObserve 和 addObserver 调用,并且不能添加重复的观察者。这意味着您必须仔细考虑在哪里添加观察者以及在哪里删除它,以免违反这些限制。
如果您在 viewDidLoad 中添加它,目前在 dealloc 中删除它就足够了(因为不再使用 viewDidUnload),但是当视图不可见时观察者可能会触发。如果您在仍然调用 viewDidUnload 的旧操作系统上运行,这也可能会出现问题,因为您必须跟踪观察者何时到位以及何时不到位。
您可以在 viewDid/WillAppear 中添加它,在这种情况下您需要在 viewDid/WillDisappear 中将其移除。这通常更简洁,因为(通常)保证调用是匹配的。
【讨论】:
您引用的链接内容相对丰富且准确。
我是这样想的:
a) VC 只在屏幕上显示时需要得到通知吗?使用 viewWillAppear/viewWillDisappear。
b)只要 VC 还活着(但不一定在屏幕上),是否需要通知它?使用 init 或 viewDidLoad 并在 dealloc 中删除。
我在 ARC 下为我的 dealloc 方法设置了断点,它们会在预期的时候被调用。但是 viewDidUnload 没有被调用。
【讨论】: