2010-12-03 21 views
0

私はいくつかの値を持つNSDictionaryを持っています。通常、NSDictionaryの値は静的ですが、まれに(ユーザーが設定を変更する)NSDictionaryが変更されます。 辞書はアプリケーション全体で使用され、アプリケーションデリゲートに格納されます。Objective-Cのポインタへのポインタ

私は今問題があります:設定が変更されると、古い辞書を解放して新しい辞書を作成します。関連するすべての関係者にどのように通知するのですか? NSDictionary *を取得するために、必要に応じてNSDictionary **のポインタを格納し、それを尊重することを考えました(辞書が解放され再作成されないケースはありません)。

NSMutableDictionary* dict = [NSMutableDictionary alloc] init]; 
... 
NSDictionary** ref = &dict; 

私がデバッガを実行すると、逆参照が最初にdictを取得することがわかります。しかし、しばらくすると、refは涅槃を指しているようです。私はメモリやsthを管理する必要があるかどうかわかります。 NSDictionary **のために?オブジェクトへのポインタではないので、それを保持することは意味をなさない。しかし、それは記憶の問題のように見えますか?

答えて

4

ポインタの複雑さについては、実際にはこのような状況には関係ないので、私はコメントしません。さらに、私は本当にあなたが望むものが何かを確信していませんが、あるオブジェクトから別のオブジェクトへの変更を観察する方法を探していると思います。素晴らしいことは、Cocoaがこれを箱から出していることです。

だから、この辞書を何か(アプリケーションデリゲート)のプロパティとして持つ必要があります。その後、変更のためにそのプロパティを見て、キー値観測ケアオブジェクトどちらにを使用します。

[appDelegate addObserver:self forKeyPath:@"dictPropertyName"]; 

その後、-observeValueForKeyPath:ofObject:change:context:を実装:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    if ([keyPath isEqualToString:@"dictPropertyName"]) { 
     // your property has changed; respond to that here 
    } 
} 

が、これはあなたが何を望むかのようなものであれば、私に教えてください。

+0

皆さん、@bbumの回答をご覧ください。彼の考えは、代わりに 'NSNotificiationCenter'を使うことです。これは、このオブジェクトの変更を気にするオブザーバーがたくさんいるときには、これを単純化します。 –

4

ジョナサンの答えは正しいです。しかし、これは大域的なものであるため、単に通知を使用して関心のあるすべての関係者に辞書が変更されたことを知らせることができるだけ多くの意味があります。

具体的には、NSNotificationCenter and NSNotificationを参照してください。

+1

私はこれがこの問題のより一般的な解決策であることに同意します.KVCは多くの場合うまくいきますが、配列全体の変更のようなものについては、誰もが聴くことができる通知を使う方が簡単でしょう。 –

関連する問題