142

目的の c オブジェクトに removeObservers: をキー パスに対して指示し、そのキー パスが登録されていない場合、sads がクラックされます。お気に入り -

「オブザーバーとして登録されていないため、キー パス "theKeyPath" のオブザーバーを削除できません。」

オブジェクトにオブザーバーが登録されているかどうかを判断する方法はありますか?

if (object has observer){
  remove observer
}
else{
  go on my merry way
}
4

10 に答える 10

316

removeObserver 呼び出しの周りに try catch を配置します

@try{
   [someObject removeObserver:someObserver forKeyPath:somePath];
}@catch(id anException){
   //do nothing, obviously it wasn't attached because an exception was thrown
}
于 2011-07-16T00:57:38.127 に答える
25

FWIW、オブザーバーがいない場合の[someObject observationInfo]ようです。ただし、文書化されているのを見たことがないので、この動作は信用できません。また、特定のオブザーバーを取得するための読み方もわかりません。nilsomeObjectobservationInfo

于 2012-02-17T03:08:27.633 に答える
4

これを行う唯一の方法は、オブザーバーを追加するときにフラグを設定することです。

于 2009-10-17T17:12:58.290 に答える
4

NSMutableArrayオブザーバーをオブジェクトに追加すると、次のように追加できます。

- (void)addObservedObject:(id)object {
    if (![_observedObjects containsObject:object]) {
        [_observedObjects addObject:object];
    }
}

オブジェクトを監視しない場合は、次のようにすることができます。

for (id object in _observedObjects) {
    if ([object isKindOfClass:[MyClass class]]) {
        MyClass *myObject = (MyClass *)object;
        [self unobserveMethod:myObject];
    }
}
[_observedObjects removeAllObjects];

単一のオブジェクトを監視しない場合は、_observedObjects配列から削除してください。

- (void)removeObservedObject:(id)object {
    if ([_observedObjects containsObject:object]) {
        [_observedObjects removeObject:object];
    }
}
于 2014-06-12T12:34:45.227 に答える
3

[someObject observationInfo]nilオブザーバーがいない場合は戻ります。

if ([tableMessage observationInfo] == nil)
{
   NSLog(@"add your observer");
}
else
{
  NSLog(@"remove your observer");

}
于 2015-11-26T11:44:42.897 に答える
3

私の意見では、これはretainCountメカニズムと同様に機能します。現時点でオブザーバーがいると確信することはできません。確認しても: self.observationInfo - 将来オブザーバーを持っている/持っていないことを確実に知ることはできません。

keepCountのように。たぶん、observationInfoメソッドはそれほど役に立たないわけではありませんが、デバッグ目的でのみ使用します。

その結果、メモリ管理のように行う必要があります。オブザーバーを追加した場合は、不要になったら削除してください。viewWillAppear/viewWillDisappear などのメソッドを使用するように。例えば:

-(void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self addObserver:nil forKeyPath:@"" options:NSKeyValueObservingOptionNew context:nil];
}

-(void) viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [self removeObserver:nil forKeyPath:@""];
}

また、特定のチェックが必要な場合は、オブザーバーの配列を処理する独自のクラスを実装し、それをチェックに使用します。

于 2015-07-03T11:34:13.743 に答える
2

オブザーバー パターンの要点は、監視されるクラスを「封印」できるようにすることです。あなたは明示的にこのパターンを破ろうとしています。

なんで?

あなたが抱えている問題は、観察されていないのに観察されていると思い込んでいるということです。このオブジェクトは観測を開始しませんでした。クラスでこのプロセスを管理したい場合は、通知センターの使用を検討してください。そうすれば、クラスはいつデータを観察できるかを完全に制御できます。したがって、誰が見ているかは気にしません。

于 2009-10-18T16:51:30.713 に答える