Проблема с массивом, свойством и NSLog - PullRequest
1 голос
/ 05 мая 2011

Итак, у меня есть этот блок кода, он добавляет игроков в NSMutableArray в моем списке проигрывателей ViewController. По какой-то причине я не могу распечатать все имена игроков в журнале. Я делаю что-то неправильно? Я получаю сообщение об ошибке, в котором говорится, что член refrence struc objc_object является указателем. Кто-нибудь может увидеть, что я делаю не так?

p1, p2, p3, p4 - все объекты NSString, которые имеют имена игроков.

метод addPlayer создает новый объект player со свойством playerName.

- (IBAction)addPlayerButton:(id)sender {
    [self.playerList addObject:[self addPlayer:p1]];
    [self.playerList addObject:[self addPlayer:p2]];
    [self.playerList addObject:[self addPlayer:p3]];
    [self.playerList addObject:[self addPlayer:p4]];
    for (id element in playerList) {
        NSLog(element.playerName);
    }
}

Ответы [ 2 ]

4 голосов
/ 05 мая 2011
for (id element in playerList) {
    NSLog(element.playerName);
}

Предупреждение / ошибка компилятора вызвано тем, что element относится к типу id, и вы не можете использовать синтаксис точки с ссылками на объекты типа id (кстати, при создании этой функции выбирается конкретный дизайн).

Фиксированный код:

for (Player *element in playerList) {
    NSLog(@"%@", element.playerName);
}

Исправлены две (не связанные) проблемы:

  1. явно введите element в качестве ссылки на ваш класс игрока (я принял название). Это позволит работать точечному синтаксису.

  2. Используйте строку формата с NSLog. Если имя игрока когда-либо будет содержать последовательность форматирования - например, %@ - тогда NSLog() попытается расширить следующий (несуществующий) аргумент до NSLog, и ваше приложение вылетит или напечатает мусор ( скажем, если имя игрока было "Боб% f% f% f").

<Ч />

не похоже, что они получают правильно добавлен в массив

Убедитесь, что вы выделяете массив и назначаете его в playerList где-то:

self.playerList = [NSMutableArray array];
0 голосов
/ 05 мая 2011

Используйте это вместо:

NSLog(@"%@", element.playerName);

NSLog похож на printf () и друзей, но не совсем.Вы должны предоставить первый аргумент, который является строковым литералом в формате, который вы хотите использовать, а затем любые переменные, представленные в формате.В Objective-C специальный формат %@ означает «используйте метод description объекта для заполнения значения (если оно есть)».Иногда вы получаете отладочный вывод для объекта, у которого нет этого метода, например, или такого, который, конечно, не слишком полезен.

В вашем случае, предполагая, что playerName является строкой NSString, вы 'вы увидите его вывод имени, если вы используете формат% @ в первом аргументе NSLog.

РЕДАКТИРОВАТЬ:

Вы должны быть в состоянии использовать оператор for, например:

for(Player *p in playerList) {
    NSLog(@"%@", p.playerName); 
}

То, что вы используете addObject: для добавления объектов, не означает, что вы должны отказаться от использования типа объектов, когда смотрите на них из массива.

Если на самом деле объекты вplayerList это просто NSString с, тогда ваш цикл может быть просто

for(NSString *name in playerList) {
    NSLog(@"%@", name); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...