1

オブジェクトがいつ解放されるかを知るにはどうすればよいですか? kvo の変更をリッスンしていますが、保持カウントが 0 になる前にオブジェクトの割り当てが解除され、次の警告が表示されます。

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

基本的に私がやろうとしているのは、モデルが却下されたときを検出することです。提示されているviewControllerは動的であり、mainViewControllerはUIViewControllerのサブクラスであるという事実以外にそれらについての知識がないため、 Delegate を使用できません。

[anotherViewController addObserver:self forKeyPath:@"retainCount" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionOld | NSKeyValueObservingOptionPrior context:nil];

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    // Here check for the changes and see of the new value is 0 or not
}

また、viewControllerのsuperViewがnilに変更されているのを聞いてみました

[anotherViewController.view addObserver:self forKeyPath:@"superView" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionOld | NSKeyValueObservingOptionPrior context:nil];
4

6 に答える 6

8

オブジェクトがサポートしているキーに対してのみ、キー値の監視を行うことができます。ここでやりたいことは、まったく不可能です。オブジェクトのオブザーバーは、 に到達するまでにすべてなくなっているはずdeallocです。このオブジェクトが必要な限り保持されるように、またはオブジェクトがなくなる前に関係者に積極的に通知するように、アプリケーションを構築する必要があります。

そして、オブジェクトを見るretainCountことは決して良い考えではありません。それが有用である限り、それはデバッグにのみ有用であり、さらに優れた、より信頼性の高いツールがあります。の結果retainCountは単に誤解を招くだけであり、ほとんどの人が期待するようには機能しません。保持カウントが 0 のオブジェクトは存在できないため、保持カウントが 1 のオブジェクトは解放されると割り当てが解除され、メッセージを送信できなくなります。 . (実際、フレームワークには到達不能な状態であるため、保持カウント 0 を表す方法が文字通りありません。)

于 2013-08-05T18:14:30.600 に答える
2

オブジェクトの割り当てが解除されたときに通知を受け取りたい場合は、dealloc で通知を送信できますが、解放されたオブジェクトを参照しないでください。

例えば

[[NSNotificationCenter defaultCenter] postNotificationName:@"myclass_dealloced" \
                                      object:[NSValue valueWithPointer:self]];

しかし、そのポインターを逆参照したくないでしょう...

これは、デバッグとテストにのみ使用してください。

于 2013-08-05T18:27:01.253 に答える