10

マップキットをいじって、注釈を作成しました。このエラーが原因でバグを見つけようとしています:

クラスAddressAnnotationのインスタンス0x1b7ac0は、キー値オブザーバーがまだ登録されている間に割り当てが解除されました。観測情報が漏洩し、他の物体に誤って付着する可能性もあります。NSKVODeallocateBreakにブレークポイントを設定して、デバッガーでここで停止します。現在の観測情報は次のとおりです。

ブレークポイントを設定するNSKVODeallocateBreakがどこにあるかわかりません。Instrumentsを使用してデバッグできると思いましたが、試してみると、クラッシュした場所がわからずにクラッシュしました。何かご意見は?

4

2 に答える 2

16

あなたはおそらくあなたのコードでこのようなことをしているでしょう:

[addressAnnotation addObserver:self forKeyPath:kSelectedAnnotationObserverKeyPath options:NSKeyValueObservingOptionNew context:@"selectedOrDeselected"];

これは、注釈が選択されたことを確認するためにオブザーバーを登録していることを意味します。

次のように、注釈がマップから削除されたら、オブザーバーを削除する必要があります。

[addressAnnotation removeObserver:self forKeyPath:kSelectedAnnotationObserverKeyPath];

これでエラーが削除されます。そうではなく、デバッグしたい場合は、必ずブレークポイントをに設定する必要がありますNSKVODeallocateBreak。これを行うには、Runメニューを開きManage Breakpoints、、、とAdd symbolic breakpoint入力するNSKVODeallocateBreakと、そこにいます。

それが役に立てば幸い!

于 2011-09-19T06:55:44.543 に答える
6

ここでLLDBを使用してブレークポイントを設定するには、アプリを起動して一時停止し、LLDBデバッグプロンプトで次のように記述します。

breakpoint set --name NSKVODeallocateBreak

これで、ブレークポイントが設定されました。うまくいけば、これは問題を見つけるのに役立つはずです。おそらく@frowingで説明されているようなものになるでしょう。

于 2013-10-14T06:58:56.557 に答える