あなたの質問は正確にはわかりません。特定のクラスのインスタンスを1つだけ持つことができるようにするSingletonというデザインパターンがあります。これはまさにあなたが望むものではありませんが、与えられたキー(あなたの場合は状態名)のためのクラスの単一のインスタンスを保持するMultitonと呼ばれるSingletonパターンの変形があります。
NSLog(@"%i", [NSNull null] == [NSNull null]); // 1
NSLog(@"%i", [NSNumber numberWithInt:42] == [NSNumber numberWithInt:42]); // 1
しかし、これらのパターンは、誤用することは非常に簡単であり、あなたはそれらなしで問題を解決することができれば、それはおそらくはるかに良いでしょう:これはどのように[NSNull null]
(シングルトン)またはNSNumber
(multiton)が動作しています。すべての状態ポインタが同じインスタンスを参照することに問題はありません。つまり、オブジェクトグラフ全体を作成するだけの問題があります。プロパティを変更可能にしておくと簡単です:
State *oregon = [[State alloc] initWithName:@"Oregon"];
State *washington = [[State alloc] initWithName:@"Washington"];
[oregon setNeighbouringStates:[NSSet setWithObject:washington]];
[washington setNeighbouringStates:[NSSet setWithObject:oregon]];
などです。あなたの問題に対するより良い解決策は、異なるデータモデル、隣接関係を表す別の方法かもしれません。しかしそれはあなたの要求に依存します。
コメントには、あなたは辞書に状態があると言います。キーは状態名であり、値は近隣状態名の配列です。その場合は、あなたはこのような何かを行うことができます。
typedef State* (^StateBuilder)(NSString *stateName);
NSDictionary *input = …;
NSMutableDictionary *states = [NSMutableDictionary dictionary];
StateBuilder getState = ^(NSString *stateName) {
State *state = [states objectForKey:stateName];
if (!state) {
state = [[State alloc] initWithName:stateName];
[states setObject:state forKey:stateName];
}
return state;
};
for (NSString *stateName in [input allKeys]) {
State *state = getState(stateName);
NSMutableSet *neighbours = [NSMutableSet set];
for (NSString *neighbourName in [input objectForKey:stateName])
[neighbours addObject:getState(neighbourName)];
[state setNeighbours:neighbours];
}
結果が[states allValues]
になってしまいます。もちろん、ブロックブードゥーは必要ではありません。states
辞書をインスタンス変数に変えて、ブロックの代わりに通常のメソッドを使うことができます。長くて退屈な設定になるだろうが、何を説明することは動作しないという理由は、ありません
Multitonが何をしているのか分かりません。私の関心事は、カリフォルニア州を隣接州としてカリフォルニア州を初期化し、その後、カリフォルニア州を再初期化してから、やり直そうとするオレゴンなど...またはカリフォルニア州を初期化しようとしていることです。カリフォルニア州をメモリにしようとしているこれらの州のすべて、そしてジャスティンがそれを参照したようなこの「コード伝染」は問題を作り出しているのだろうか? –
Joshによって与えられた例は正常に動作します。トリックは、状態を一度しか作成せず、参照を変数に保存してから、その変数を隣人を設定するときに使用することです。私はあなたの辞書シナリオのサンプルコードを与えるために私の答えを更新します。 – zoul
完璧に見える!ありがとうございました! –