0

当我将自己作为 -(void)dealloc 中的观察者移除时,我的 CALayer 子类发生崩溃:

- (void)dealloc {
 [[NSUserDefaults standardUserDefaults] removeObserver:self forKeyPath:@"showColorLabels"];
 [colorLabel release];
 [_color release];
 [super dealloc];
}

抛出异常。它说 self 没有被添加为观察者。这只发生在特定情况下,在调用 [CATransaction flush] 之后。

我使用 Instruments 查看对象的分配时间。它说它是通过调用 CALayerGetPresentationLayer() 分配的。我不确定这是如何工作的,但我猜这是我原始层的副本,所以从未调用过 init,也从未将我添加为观察者。

如何在移除自己之前检查我是否是观察者,或者判断我是否是表示层?

布里杰麦克斯韦

4

2 回答 2

2

我在这里找到了一个很好的解决方案:https ://stackoverflow.com/a/6714561/958017

您可以在调用 removeobserver 时使用 try-catch 块:

@try{
   [[NSUserDefaults standardUserDefaults] removeObserver:self forKeyPath:@"showColorLabels"];
}@catch(id anException){
   //Whatever you want to do.
}
于 2013-08-09T15:42:46.233 回答
0

Wellllll .... 回答一个明显的问题:

您在哪里添加self作为@"showColorLabels密钥的观察者?

-removeObserver:forKeyPath:除非您首先明确地将对象添加为观察者,否则您不必调用。

于 2010-02-22T02:55:08.380 回答