Привет, я пытаюсь создать вложенный массив ...
Не делай этого. Параллельные и вложенные массивы труднее писать и читать, чем реальные объектно-ориентированные решения, подобные предлагаемому eJames, то есть созданию класса модели.
Рассмотрим код для установки вида предмета первого предмета каждого игрока. С параллельными / вложенными массивами:
for (NSArray *items in PlayerItems)
[[items objectAtIndex:0U] setKind:newKind];
С объектами модели:
for (Player *player in players)
[player setKind:newKind];
Какой из них яснее?
Работа, необходимая для поддержки параллельных и вложенных массивов, для синхронизации их всех при каждом изменении и доступа к любому элементу в них, намного больше, чем работа, необходимая для создания класса модели. Кроме того, если вы решите портировать на Mac, отсутствие классовой модели активно причиняет вам боль, поскольку вы не можете использовать Bindings, а реализация поддержки AppleScript (не большая проблема для игры, я признаю) практически невозможна.
Как уже упоминал eJames, вы обильно пропускаете объекты. Следуйте его рекомендациям и прочитайте Руководство по программированию управления памятью для какао.
Как сказал pgb, индексы массивов в Какао (и C, в этом отношении) начинаются с 0. Более того, вы, как правило, не используете индексы без необходимости; см. мои примеры кода выше для более ясного способа итерации в массиве.
Как указывают pgb и Christian, addObject:
- это метод, который возвращает void
, который вы затем приводите к NSMutableArray *
. Возможно, вы хотели поместить этот бросок в первую пару квадратных скобок? Но это еще одна проблема, с которой вы бы не столкнулись, если бы у вас был реальный класс модели, поскольку вы настраивали бы все сразу для нового игрока, включая его предметы:
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];
Это подводит меня к еще одному предложению: вы также можете создать класс модели для типов элементов и иметь их где-нибудь. Тогда каждый вид может иметь имя, значок, возможно, описание, природу, такую как одноручное или двуручное, требования к классу, требования к статистике и т. Д., Прямо в объекте типа элемента. Цикл выглядит следующим образом:
for (ItemKind *kind in [self kindsOfItems]) {
Item *item = [[Item alloc] initWithKind:kind];
[player addInventoryObject:item];
[item release];
}
Кроме того, если вы расширяете это свойство kindsOfItems
, вы можете позволить игрокам добавлять больше видов предметов позже, либо через подключаемые модули (Mac), либо через приложения для покупок (iPhone).