こんにちは、ネストされた配列を構築しようとしています…</p>
そうしないでください。並列およびネストされた配列は、eJames が提案したような実際のオブジェクト指向ソリューション (モデル クラスの作成) よりも、読み書きが困難です。
すべてのプレーヤーの最初のアイテムのアイテムの種類を設定するコードを検討してください。並列/ネストされた配列の場合:
for (NSArray *items in PlayerItems)
[[items objectAtIndex:0U] setKind:newKind];
モデル オブジェクトの場合:
for (Player *player in players)
[player setKind:newKind];
どちらがより明確ですか?
並列配列とネストされた配列を維持し、変更ごとにそれらすべてを同期させ、それらの項目にアクセスするために必要な作業は、モデル クラスを作成するために必要な作業よりもはるかに多くなります。さらに、Mac に移植することに決めた場合、バインディングを使用できず、AppleScript サポートの実装 (ゲームにとってはそれほど大したことではないことは認めます) がほぼ不可能であるため、モデル クラスを持たないと積極的に損をします。
eJames も述べたように、オブジェクトを大量にリークしています。彼の推奨に従って、Cocoa のメモリ管理プログラミング ガイドを読んでください。
pgb が言ったように、Cocoa (および C も同様) の配列インデックスは 0 から始まります。配列を反復処理するより明確な方法については、上記のコード例を参照してください。
pgb と Christian の両方が指摘しているように、addObject:
は を返すメソッドでvoid
あり、それを にキャストしNSMutableArray *
ます。おそらく、そのキャストを角括弧の最初のペアの中に入れるつもりでしたか? しかし、これは、実際のモデル クラスがあれば、アイテムを含む新しい Player に関するすべてを一度に設定することになるため、発生しない別の問題です。
Player *player = [[Player alloc] init];
//Set up name, SPECIAL stats, etc.
for (int kind = 1; kind < 50; ++kind) {
Item *item = [[Item alloc] init]; //I capitalized your class name for you.
[item setKind:kind];
[player addInventoryObject:item]; //Assume “inventory” is the name of the property that holds the player's items.
[item release];
}
[allPlayers addObject:player];
[player release];
これにより、もう 1 つの提案が得られます。項目の種類のモデル クラスを作成し、それらの配列をどこかに配置することもできます。次に、それぞれの種類に名前、アイコン、おそらく説明、片手対両手などの性質、クラス要件、ステータス要件などをすべて item-kind オブジェクトに含めることができます。ループは次のようになります。
for (ItemKind *kind in [self kindsOfItems]) {
Item *item = [[Item alloc] initWithKind:kind];
[player addInventoryObject:item];
[item release];
}
さらに、このプロパティを拡張可能に設計するkindsOfItems
と、プラグイン (Mac) またはアプリ内購入 (iPhone) のいずれかを使用して、プレーヤーが後でより多くのアイテムの種類を追加できるようになります。