1

私は同じクラスのインスタンスでIVARを持っているのObjective Cでクラスを書いている...Objective Cのクラス・データ構造、アイバーズとしてクラス参照のインスタンスを一度別の

@interface State : NSObject { 
NSString *name 
NSSet *neighboringStates // this is a set of State objects 
} 

州*カリフォルニア* neighbourStatesには* oregon、* washington、* nevadaが含まれています。 これらの3つの州のそれぞれは、近隣の州*カリフォルニア州の間にあります。

ポインタが同じインスタンスを参照し、各状態が一度だけインスタンス化され、別の状態のメソッド呼び出し中の状態の変更がメモリ内の同じオブジェクトに影響するようにします。

これは機能しますか?私はこれについての用語が何であるかも分からないので、それをGoogleにするのは難しい。

私はあなたの助けに感謝します!

EDIT:

は私が何をしようとしている上であなたに多くの明快さを与えるために、私はそれぞれの状態を一度だけ訪問され、並べ替え、リスト内の各次の状態がなければならないような状態の順列を生成したいのですが隣接/隣接状態から現在の状態にすることができる。だから私がカリフォルニアで始まってオレゴンに旅行すると、私の現在の道にカリフォルニアが含まれていることを知っているので、私はカリフォルニア州を利用可能な州から外します。私は現在の状態のneighbourStatesセットを取って、現在のパスにある状態を削除することによって、利用可能な状態を追跡します。

答えて

1

あなたの質問は正確にはわかりません。特定のクラスのインスタンスを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辞書をインスタンス変数に変えて、ブロックの代わりに通常のメソッドを使うことができます。長くて退屈な設定になるだろうが、何を説明することは動作しないという理由は、ありません

+0

Multitonが何をしているのか分かりません。私の関心事は、カリフォルニア州を隣接州としてカリフォルニア州を初期化し、その後、カリフォルニア州を再初期化してから、やり直そうとするオレゴンなど...またはカリフォルニア州を初期化しようとしていることです。カリフォルニア州をメモリにしようとしているこれらの州のすべて、そしてジャスティンがそれを参照したようなこの「コード伝染」は問題を作り出しているのだろうか? –

+0

Joshによって与えられた例は正常に動作します。トリックは、状態を一度しか作成せず、参照を変数に保存してから、その変数を隣人を設定するときに使用することです。私はあなたの辞書シナリオのサンプルコードを与えるために私の答えを更新します。 – zoul

+0

完璧に見える!ありがとうございました! –

2

ファクトリーの役割も果たすCountryクラスを作成します。

したがって、Statesは、Statesを作成せず、Countryから取得します。

同様に、クライアントはStateを作成しませんが、Countryから要求します。あなたが「単に」48 codependents(neighboringStates)を初期化することはできませんので - CountryからStateのため

要求もStateが適切にそれを戻す前に、公共の用に初期化されていることを確認できました。

2

コードでこのすべてのアップ:あなたはこのようなデータを持っている場合は

State * california = [State stateWithName:@"California"]; 
State * oregon = [State stateWithName:@"Oregon"]; 
State * nevada = [State stateWithName:@"Nevada"]; 
// And so on, forty-seven more times. 
// Stick them in an array or something? 
// Now use all those instances that you've just created to set up 
// the neighboring states. 
[california setNeighboringStates:[NSSet setWithObjects:oregon, nevada, nil]; 
[oregon setNeighboringStates:[NSSet setWithObjects:washington, california, idaho, nevada, nil]; 
// And so on, forty-seven more times. 

が、しかし、それはですアプリケーションの存続期間中は固定されているので、何らかのデータファイルに貼り付けて実行時に保管することを検討したいと思うでしょう。

+1

ワシントンはカリフォルニアに直接隣接していないことにも注意してください。 :) –

+0

私はキーとして各状態を持つ辞書をオブジェクトとして持っているので、列挙型でそれらを初期化する予定でした。私がしたときに、州は以前に初期化された州を参照することはありませんでしたが、それらを上書きしたり、重複したものを作成したりするだろうと心配していました。 –

関連する問題