Неявное логическое преобразование литерала объекта Objective-C всегда оценивается как истинное значение ios

Я недавно скачал Xcode 9.2 и обновил настройки своего проекта до рекомендованных. Теперь я получаю это предупреждение в своем коде для всех мест, где я использовал assert, например:

assert(@"Must be implemented by subclass");

Какова правильная альтернатива для этого?

3 ответа

Решение

Если вы используете Objective-C, вы хотите позвонить NSAssert()не assert() (которая является функцией C).

NSAssert(NO, @"Must be implemented by subclass");

Если вы хотите продолжить использовать assert(), вы должны рассматривать это как функцию C.

assert(0); // <-- Note: no message is provided

Вы можете сойти с рук

assert(/* Must be implemented by subclass */ 0);

или же

assert("Must be implemented by subclass" == NULL); // <-- Note: No `@`

Ваш assert условие - это строка, которая всегда будет проходить тест.

Вы должны проверить состояние в assert

А) утверждение требует условия для проверки. Вы рассматриваете строку как условие, и она не равна нулю...

б) вы используете NSString, а не char*, поэтому вы передаете объект objC в C, который в этом случае тоже не будет работать...

assert(codition & "Message");

в) вы должны использовать NSAssert для кода ObjC.. сделать

NSAssert(codition, @"Message");
Другие вопросы по тегам