Массив объектов - PullRequest
       17

Массив объектов

1 голос
/ 18 мая 2010

Полный и полный новичок в Objective-C и всей платформе Mac, поэтому, пожалуйста, не сердитесь на меня =). В основном я пытаюсь создать простую игру. В игре есть доска, для которой я создал класс, и доска состоит из квадратов, для которых я также создал класс (доска и квадрат соответственно).

В моем контроллере вида я пытаюсь создать экземпляр платы и добавить поля BoardSize ^ 2 к указанному объекту. доска содержит NSMutableArray * squares.

Я также создал вспомогательный метод, который устанавливает NSNumber * boardSize с именем initWithDimension.

В моем обработчике touchesBegan у меня есть следующее:

board *game_board = [[board alloc] initWithDimension:10];   
int size = [game_board.boardSize intValue];

for(int i = 0; i <= size; i++) {
    square *s = [[square alloc] init];
    [game_board.squares addObject:s];
    [s release];
}

NSLog(@"%i", size);
NSLog(@"%@", [game_board.squares objectAtIndex:0]);

... и я получаю 10 (как ожидалось), а затем (ноль). Это, вероятно, очевидно очевидно для опытного разработчика, я только час пытался решить его и сдался. Я тоже пробовал без [s release], тот же результат. Я также импортировал square.h и board.h.

Есть идеи, что здесь не так? Любые другие комментарии о том, что я брутал?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 18 мая 2010

Вы выделяете и инициализируете свою переменную квадратов в initWithDimension?

2 голосов
/ 18 мая 2010
  1. Основная проблема, с которой вы сталкиваетесь, заключается в следующем: в опубликованном коде вы никогда не назначаете ссылку на объект game_board.squares, поэтому она неявно инициализируется как nil. Когда вы звоните addObject: на nil, ничего не происходит. Это определенное поведение в языке Objective-C. Таким образом, вы должны добавить присваивание формы squares = [[NSMutableArray alloc] initWithCapacity:boardSize*boardSize]] перед добавлением объектов.

  2. Вы должны инициализировать свою доску в методе initWithDimensions:. В этом весь смысл создания класса - инкапсуляция поведения объекта. Поскольку Board является администратором объектов Square, он должен инициализировать и управлять ими.

  3. Стилистически имена классов предпочтительно пишутся в Паскале, что означает, что каждое слово в верхнем регистре: MyClassName. (В этом случае предпочитайте от Board до board и Square до square.)

1 голос
/ 18 мая 2010

Я предполагаю, что game_board.squares равно нулю. Поэтому передача ему сообщения (addObject) ничего не делает внутри цикла. И objectAtIndex тоже ничего не делает.

Можете ли вы опубликовать свой код init из квадратного класса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...