1

同じクラスのインスタンスを持つivarを持つObjectiveCでクラスを書いています...

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

州*カリフォルニアには、*オレゴン、*ワシントン、および*ネバダを含む*neighboringStatesがあります。これらの3つの州のそれぞれは、隣接する州の中に*カリフォルニアを持っています。

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

これは機能しますか?これの用語が何であるかさえわからないので、それをグーグルで検索するのは難しいです。

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

編集:

私がやろうとしていることをより明確にするために、各状態が1回だけ訪問され、順列リスト内の次の各状態が隣接/隣接状態から現在の状態にならなければならないように、状態の順列を生成したいと思います1。カリフォルニアで始めてオレゴンに旅行したら、現在のパスにカリフォルニアが含まれていることがわかっているので、利用可能な州からカリフォルニアを削除します。現在の状態のneighborhoodStatesセットを取得し、現在のパスにあるすべての状態を削除することで、使用可能な状態を追跡します。

4

3 に答える 3

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.

ただし、このようなデータがある場合は、アプリケーションの存続期間中は修正されます。そのデータをある種のデータファイルに貼り付けて、実行時にアーカイブを解除することを検討する必要があります。

于 2012-02-27T06:19:47.727 に答える
2

ファクトリCountryとしても機能するクラスを作成します。State

したがって、States他のものを作成しないでください、彼らは彼らが属するStatesものからそれらを取得します。Country

同様に、クライアントはを作成しませんStateが、から要求しますCountry

Stateからのsの要求は、aがパブリックで使用するために適切に初期化されているCountryことを確認してStateから返すこともできます。これは、48個の共依存関係を「単純に」初期化できないためです(neighboringStates)。

于 2012-02-27T06:13:54.487 に答える
1

あなたの質問が正確に何であるかわかりません。シングルトンと呼ばれるデザインパターンがあり、特定のクラスのインスタンスを1つだけ持つことができます。これは正確にはあなたが望むものではありませんが、与えられたキー(あなたの場合は州名)のクラスの単一のインスタンスを保持するMultitonと呼ばれるシングルトンパターンの変形があります。これは、[NSNull null](シングルトン)またはNSNumber(マルチトン)の仕組みです。

NSLog(@"%i", [NSNull null] == [NSNull null]); // 1
NSLog(@"%i", [NSNumber numberWithInt:42] == [NSNumber numberWithInt:42]); // 1

しかし、これらのパターンは非常に誤用されやすいので、それらなしで問題を解決できれば、おそらくはるかに良いでしょう。すべての状態ポインタが同じインスタンスを参照するようにすることに問題はありません。つまり、オブジェクトグラフ全体を作成するという問題だけがあります。プロパティを変更可能に保つと、これは簡単です。

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辞書をインスタンス変数に変換し、ブロックの代わりに通常のメソッドを使用できます。

于 2012-02-27T06:14:43.313 に答える