2011-12-18 2 views
34

Я часто видел «утверждать» в коде iOS, я google, и узнал, что он утверждает true или false.Как узнать, отключен ли NSAssert в версиях?

Я хочу знать, будет ли это автоматически отключено в режиме деблокирования?

+2

Это, откровенно говоря, сумасшедший дизайн, который утверждает, что настройки по умолчанию не отключены. Мухи перед каждым другим компилятором, о котором я знаю. –

+0

@SevaAlekseyev Согласитесь, мы получили шок, когда Assertions все еще прошли через Release. Совершенно нетрадиционно. Наша философия - «быстро развиваться, умереть в производстве». –

ответ

38

Используйте NSAssert() и его спутников.

в проекте определите NS_BLOCK_ASSERTIONS для вашей конфигурации выпуска.

Тректы Xcode 4 отключены NSAsserts в конфигурации выпуска. Он добавляет

-DNS_BLOCK_ASSERTIONS=1 

на «Другие флаги C» для «выпуска».

Из документации:

Утверждения отключены, если макрос препроцессора NS_BLOCK_ASSERTIONS определен.

Макрос NSAssert оценивает условие и служит в качестве переднего конца обработчика утверждения.

Каждый поток имеет свой собственный обработчик утверждения, который является объектом класса NSAssertionHandler. При вызове обработчик assert выводит сообщение об ошибке, включающее имена методов и классов (или имя функции). Затем он вызывает исключение NSInternalInconsistencyException. Если условие равно NO, макрос вызывает handleFailureInMethod:object:file:lineNumber:description: в обработчике утверждения для текущего потока, передавая desc в качестве строки описания.

Этот макрос должен использоваться только в рамках Objective-C методов.

4

Атрибуты условно скомпилированы из вашего кода при определении NDEBUG. Если вы определяете NDEBUG=1 в соответствующем разделе настроек сборки, вы дезактивируете утверждения в своем коде независимо от режима выпуска или отладки.

24

Я здесь обеспечить мета-ответ:

Оба @CocoaFu и @dasblinkenlight являются правильными. NS_BLOCK_ASSERTIONS отключается NSAssert() и NDEBUG отключается assert(). Вам нужны оба, если вы используете оба.

+0

Чтение iOS 5 Программирование by @Rob: получить его, прочитать его, улучшить программу в iOS 5. – zaph

+0

К сожалению, в сводке двух слов, которые вы неправильно написали. – Ant

+1

Отмечено и исправлено. NSDEBUG-> NDEBUG –

7

As Zaph сказал, что -DNS_BLOCK_ASSERTIONS=1 предназначено для выпуска. Однако, если вы хотите проверить это.

Сначала обратите внимание на документы, что NSAssert отключен макросом NS_BLOCK_ASSERTIONS. Затем добавьте в сборку и наблюдать это соответствует нормально:

#ifdef NS_BLOCK_ASSERTIONS 
#error Error - NS_BLOCK_ASSERTIONS is defined 
#endif 

Затем измените схему выпуска (ЦМД - сдвиг - <)

enter image description here

Тогда заметим, что сборка не удается. Поэтому определено значение NS_BLOCK_ASSERTIONS, значение NSAssert s отключено.

0

Теперь, начиная с Xcode 6, настройка ENABLE_NS_ASSERTIONS, которая установлена ​​для 1 для конфигураций отладки и 0 для выпуска по умолчанию.

Вы можете выбрать его для выпуска в командной строке, передав аргумент ENABLE_NS_ASSERTIONS=1, который я делаю для запуска модульных тестов, которые проверяют условия утверждения, но в противном случае должен запускаться с флагом DEBUG.

26

Обновление: Проверено, что это работает в Xcode 8.

В Xcode 7 зайдите в настройки сборки проекта и найдите «Assert» в строке поиска. Это показывает раздел «Apple LLVM 7.0 - Предварительная обработка». Существует настройка под названием «Включить утверждения утверждений».

Я успешно включил/отключил NSAssert оттуда.

enter image description here

+2

, который добавляет флаг 'ENABLE_NS_ASSERTIONS = NO;' в файл AppName.xcodeproj/project.pbxproj' приложения – computingfreak

0

Вот что я делаю в верхней части моего main():

#if defined(NDEBUG) 
{ 
    // The assertion code below should be compiled out of existence in a release 
    // build. Log an error and abort the program if it is not. 
    bool ok = true; 
    NSCAssert(ok = false, @"NS assertions should be disabled but are not"); 
    if (!ok) 
    { 
    NSLog(@"Detected release build but NS_BLOCK_ASSERTIONS is not defined"); 
    return -1; 
    } 
} 
#endif 

Обратите внимание, что поскольку main() является функцией C, а не функция Objective-C, NSCAssert используется выше, чем NSAssert , (NSAssert ожидает, что self будет действительным.)

Смежные вопросы