0

-(void)dealloc でオブザーバーとして自分自身を削除すると、CALayer サブクラスでクラッシュが発生します。

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

例外がスローされます。self がオブザーバーとして追加されていないことを示しています。これは、[CATransaction フラッシュ] が呼び出された後、特定のケースでのみ発生します。

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

まあ....それに応じて明白な質問をする:

キーselfのオブザーバーとしてどこに追加しますか?@"showColorLabels

-removeObserver:forKeyPath:最初にオブジェクトをオブザーバーとして明示的に追加しない限り、呼び出す必要はありません。

于 2010-02-22T02:55:08.380 に答える