Как читать журналы ошибок «нераспознанного селектора» в приложениях obj-c / iphone - PullRequest
1 голос
/ 24 августа 2011

В моем приложении произошла следующая ошибка журнала:

-[NSNull length]: unrecognized selector sent to instance 0x194adc8

Как мне это прочитать?Означает ли это, что:

  • Я отправил сообщение 'length' объекту 'NSNull'?
  • Сбой метода "length" в классе 'NSNull'при попытке вызвать селектор для другого класса?

Кроме того, если это первый вариант, как я могу получить трассировку стека, чтобы увидеть, какая функция вызвала этот сбой?Эта верхняя строка - единственная ошибка в моем журнале.

Спасибо

Ответы [ 5 ]

5 голосов
/ 24 августа 2011

Дверь 1

NSNull не отвечает на length

Вы можете проверить документацию для NSNull , чтобы убедиться, что это так.

Не имея представления о том, что делает ваша кодовая база, я не уверен, где искать, вы должны вызывать [NSNull null]; в какой-то момент, чтобы получить объект NSNull, или вы используете фреймворк, который возвращает это.

2 голосов
/ 24 августа 2011

Это означает, что вы отправили «length» в NSNull, а NSNull не имеет функции «length».

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

В любом случае, чтобы включить NSZombies, откройте «Проект»> «Редактировать активный исполняемый файл»> вкладку «Аргументы»> Затем добавьте переменную с именем NSZombieEnabled и установите значение «YES». Убедитесь, что вы выключите его, когда закончите, потому что это может вызвать проблемы с памятью.

1 голос
/ 14 июня 2012

Это означает, что вы используете метод Length для вычисления длины строки

Like If ([strText Length]> 0) {// сделать что-то здесь ----} else {// Do somethigздесь--}

Так что в вышеприведенном случае strText равен NSNull, тогда определенно произойдет сбой, и GDB покажет сообщение вроде: [Длина NSNull]: нераспознанный селектор, отправленный на экземпляр

Как указано вышеуже сказано, что Null не имеет метода Length.

Для спасения: сначала проверьте: if ((NSNull *) strText == [NSNull null]) {return strText = @ "";} Это предотвратит сбой для NSNULL

0 голосов
/ 21 мая 2013

Поскольку вы копируете класс NSNull в длину

, проверьте перед этим

    if ([NSString *str isKindOfClass:[NSNull null]]){
       str=@"";
    }

, а затем проверьте длину для строки.

все работает! Thx

0 голосов
/ 24 августа 2011

Зомби не помогут в этом случае. Как сказал Paul.s, NSNull является действительным объектом. Вы должны получить трассировку стека, когда приложение останавливается. Открыта ли панель отладчика? Убедитесь, что это так. Я уверен, что Xcode 4 всегда останавливается на исключениях с трассировкой стека. Если по какой-то причине вы все еще не видите его, если вы находитесь в приглашении (gdb), вы можете набрать 'bt' (backtrace), чтобы получить трассировку.

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