删除Self作为观察者时崩溃 - CALayer

时间:2010-02-22 01:50:53

标签: objective-c macos key-value-observing

当我在观察员中删除自己时,我的CALayer子类崩溃了 - (void)dealloc:

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

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

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

如何在删除自己之前检查我是观察者,还是告诉我是否是表示层?

Bridger Maxwell

2 个答案:

答案 0 :(得分: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.
}

答案 1 :(得分:0)

Welllll ....回答这个明显的问题:

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

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