Когда селектор вызывается в Objective-C, и приложение аварийно завершает работу, в результате чего стек отладки указывает на селектор, что является причиной этого?Из того, что я понимаю, это происходит в результате ошибки памяти.Однако и объект, которому я отправляю команду, и параметр (массив) действительны.Я могу сказать, потому что эти два объекта показывают местоположения памяти, а также другую информацию, когда они наведены в Xcode.
Поскольку трассировка заканчивается на этом селекторе, я в растерянности.Я никогда не видел этой ошибки, когда стек указывает на селектор с допустимыми параметрами объекта.
Кроме того, этот селектор вызывается часто.Он всегда имеет дело с одними и теми же типами объектов, и нет ничего, что бы указывало на ненормальное поведение перед моим сбоем.
Это сбои нечасты, происходят каждые 10 минут или меньше.
Поскольку я начинающий программист, вероятно, что-то не так с кодом внутри селектора.Часто я сравниваю указатели объектов следующим образом:
if (thisObject.pointerToSomeObject == nil) { //do stuff...
Я начинаю сомневаться в правильности программирования в Objective-C, но, опять же, код работает большую часть времени.Есть угловой случай, о котором я не знаю?
Дополнительная информация: Я использую cocos2d версии 1.0.0, Xcode 4.1.Тестирование на симуляторе iPad.
Любая помощь приветствуется, даже ссылки на соответствующие статьи по отладке будут полезны.
РЕДАКТИРОВАТЬ
Разработки:
Поток отладки по умолчанию, указывающий на селектор, с ошибкой неверного доступа может означать, что плохой доступ происходит в ходе выполнения этого селектора.Можно включить дальнейшую отладку с помощью NSZombies, чтобы найти точную линию.
Итак, после включения NSZombies проблема раскрывается более подробно.(Спасибо @Lou Franco за этот урок плохого доступа)
Теперь, что может заставить:
if ([thisZombie target] == nil)
оценить НЕТ, но выбрасывать неправильный доступ при доступе к целому числу в [thisZombie target]
?target
- указатель на объект NSO (зомбированный)
else {
int diffx = [thisZombie x] - [[thisZombie target] x];
// ^^ ----- bad access here
** РЕДАКТИРОВАТЬ 2 **
В синтаксисе илиоценка канала:
if (!thisZombie.target && thisZombie.leader && !thisZombie.leader.dead)
thisZombie.leader.dead останавливает поток с помощью: "* - [Zombie dead]: сообщение отправлено освобожденному экземпляру 0x2108f0"
IПредположим, я должен упомянуть, что в этой игре есть «Зомби», которые не следует путать с «NSZombie»
Итак, программа оценивает «thisZombie.target» как «true», но когда я иду, чтобы получить доступ к «thisZombie».target.x "Программа прекращает выполнение.
Почему?
РЕДАКТИРОВАТЬ 3
Привет всем, я хотел бы поблагодаритьВас всех снова за ваши полезные комментарии и предложения.Я решил решить эту проблему, полностью изменив то, как мои зомби следуют за своими лидерами.
У меня все еще нет идеи, что могло бы вызвать оценку, как описано выше, но ответ больше не требуется.