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 可能是不平衡的和不确定的。您应该在 viewDidLoad
和 dealloc
.
这样有保证的配对中执行 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"];
}
我有一个简单的 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 可能是不平衡的和不确定的。您应该在 viewDidLoad
和 dealloc
.
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"];
}