gpt4 book ai didi

iphone - 我该如何自行注销 KVO?

转载 作者:行者123 更新时间:2023-12-03 20:09:15 29 4
gpt4 key购买 nike

我尝试使用 KVO 观察 UIView 子类上的属性,以便通过调用 drawRect: 触发绘制。在我的 initWithFrame: 中,我有这个:

...
self.observedKeysThatTriggerRedraw = [NSArray arrayWithObjects:@"name", nil];
for (NSString *aKey in self.observedKeysThatTriggerRedraw) {
[self observeValueForKeyPath:aKey ofObject:self change:nil context:redrawContextString];
}
...

(redrawContextString 是此类特有的常量 NSString)

KVO 通知正在正常触发,这会正确触发重绘。问题是取消注册 KVO。如果我不取消注册,一切都会正常运行,但如果我将其放在 dealloc 的顶部,则会出现异常:

for (NSString *aKey in self.observedKeysThatTriggerRedraw) {
[self removeObserver:self forKeyPath:aKey];
}

self.name = nil;
...
[super dealloc];

我在控制台中收到此消息,并且当它到达 removeObserver:forKeyPath::

时发生崩溃

CoreAnimation: ignoring exception: Cannot remove an observer <MyViewClass 0x5b47210> for the key path "name" from <MyViewClass 0x5b47210> because it is not registered as an observer

当你观察self时,有什么技巧可以注销KVO吗?在调用 dealloc 时,我的观察者是否已取消注册?我在很多地方读到过,你不应该在dealloc中注销KVO,但我不确定在观察self时我还能在哪里做到这一点。

最佳答案

您实际上尚未使用 addObserver:forKeypath:options:context: 将 View 注册为观察者。您应该将 self 注册为观察者,或者(如果您不以标准方式使用 KVO,请手动发送 observeValueForKeyPath...),您不应该尝试取消注册 self 作为观察者。

关于iphone - 我该如何自行注销 KVO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4871393/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com