Отладка неожиданного сообщения об ошибке - возможна проблема с управлением памятью? - PullRequest
0 голосов
/ 12 мая 2010

Я пытаюсь отладить приложение, которое выдает странные (для моих неопытных глаз) ошибки. Когда я пытаюсь просто записать счетчик массива ...

NSLog(@"Array has %i items", [[self startingPlayers] count]);

... Иногда я получаю сообщение об ошибке:

-[NSCFString count]: unrecognized selector sent to instance 0x1002af600

или другое время

-[NSConcreteNotification count]: unrecognized selector sent to instance 0x1002af600

Я не отправляю 'count' на какой-либо NSString или NSNotification, и эта строка кода работает нормально.

Теория ...

Хотя ошибка меняется, сбой происходит в предсказуемое время, сразу после того, как я пробежал какой-то другой код, где я думаю, что у меня может быть проблема с управлением памятью. Возможно ли, что ссылка на объект все еще указывает на то, что должно быть уничтожено? Извините, если мои термины выключены, но, возможно, он ожидает массив по адресу, на который он вызывает 'count', но находит другой предыдущий объект, который еще не должен быть там (например, NSString)? Это вызвало бы проблему?

Если так, какой самый эффективный способ отладки и выяснения, что это за адрес? Большая часть моей отладки до сих пор связана со вставкой NSLogs, так что это была бы хорошая возможность узнать, как использовать отладчик.

Ответы [ 2 ]

5 голосов
/ 12 мая 2010

Это признак того, что область памяти, в которой ваш код ожидает вашего массива, имеет либо:

  1. Был освобожден, и в том же месте была выделена другая переменная
  2. забит плохим кодом

Моя ставка будет на первую. Вам нужно внимательно посмотреть, где вы размещаете массив, и убедиться, что вы не позволяете его счетчику достичь нуля.

Помните, что если вы выделяете массив с помощью удобного метода (в основном тот, который начинается с array), а не сохраняете его или не назначаете его с помощью точечной нотации (например, self.myArray = [NSArray arrayWith...]) и свойства, помеченного retain , он будет освобожден, возможно, как только метод, в котором вы его разместили, вернется.

TL; DR - проверить, где вы назначаете массив, и убедиться, что вы используете что-то вроде этого:

self.startingPlayers = [NSArray arrayWithObjects:@"first", @"second", nil];

и не так:

startingPlayers = [NSArray arrayWithObjects:@"first", @"second", nil];

Этот человек укусил меня бесчисленное количество раз, в том числе в середине презентации сразу после того, как я упомянул, что не буду этого делать.

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

Что возвращает [self startPlayers]? Попробуйте напечатать сначала:

NSLog ("initialPlayers is% @", self.startingPlayers);

Возможно, startPlayers содержит неверный указатель (неинициализированный) или указатель на то, что уже было выпущено (и повторно использовано для чего-то другого).

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