iOS KVO - 无法删除观察者

iOS KVO - Cannot remove an observer

我有一个简单的 Viewcontroller,它符合 KVO 标准并包含以下内容:

  - (void) viewDidAppear:(BOOL)animated
    {
        [super viewDidAppear:animated];



        [self addObserver:self forKeyPath:@"importStuff" options:0 context:NULL];
        [self addObserver:self forKeyPath:@"importStuffFailed" options:0 context:NULL];
        }

    - (void) viewWillDisappear:(BOOL)animated
    {
        [super viewWillDisappear:animated];

        [self removeObserver:self forKeyPath:@"importStuff"];
        [self removeObserver:self forKeyPath:@"importStuffFailed"];
      }

我遇到的问题是有时用户会报告以下错误:

Cannot remove an observer <MyViewController 0x145d0c8d0> for the key path "importStuff" from <MyViewController 0x1741b2280> because it is not registered as an observer.

代码中的其他任何地方都没有调用 addObserver 调用。是关于我缺少的生命周期的东西吗? viewDidAppear 不保证被调用一次(所以它应该正确注册密钥?)

不能保证 viewDidAppear 每次都会与 viewWillDisappear 匹配。这意味着你的 KVO registration/unregistration 可能是不平衡的和不确定的。您应该在 viewDidLoaddealloc.

这样有保证的配对中执行 KVO registration/unregistration

Apple Docs 说有一种方法可以在视图仅可见时添加观察者。根据 图 1 - 有效状态转换,您可以使用对 viewWillAppear/viewWillDisppear 添加和删除观察者。同时您可以使用 init/dealloc 对,但不能使用 viewDidLoad/dealloc - 无法加载视图,但会释放控制器。

您的代码应该是:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    [self addObserver:self forKeyPath:@"importStuff" options:0 context:NULL];
    [self addObserver:self forKeyPath:@"importStuffFailed" options:0 context:NULL];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    [self removeObserver:self forKeyPath:@"importStuff"];
    [self removeObserver:self forKeyPath:@"importStuffFailed"];
}