Я часто видел «утверждать» в коде iOS, я google, и узнал, что он утверждает true или false.Как узнать, отключен ли NSAssert в версиях?
Я хочу знать, будет ли это автоматически отключено в режиме деблокирования?
Я часто видел «утверждать» в коде iOS, я google, и узнал, что он утверждает true или false.Как узнать, отключен ли NSAssert в версиях?
Я хочу знать, будет ли это автоматически отключено в режиме деблокирования?
Используйте 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 методов.
Атрибуты условно скомпилированы из вашего кода при определении NDEBUG
. Если вы определяете NDEBUG=1
в соответствующем разделе настроек сборки, вы дезактивируете утверждения в своем коде независимо от режима выпуска или отладки.
Я здесь обеспечить мета-ответ:
Оба @CocoaFu и @dasblinkenlight являются правильными. NS_BLOCK_ASSERTIONS
отключается NSAssert()
и NDEBUG
отключается assert()
. Вам нужны оба, если вы используете оба.
As Zaph сказал, что -DNS_BLOCK_ASSERTIONS=1
предназначено для выпуска. Однако, если вы хотите проверить это.
Сначала обратите внимание на документы, что NSAssert отключен макросом NS_BLOCK_ASSERTIONS
. Затем добавьте в сборку и наблюдать это соответствует нормально:
#ifdef NS_BLOCK_ASSERTIONS
#error Error - NS_BLOCK_ASSERTIONS is defined
#endif
Затем измените схему выпуска (ЦМД - сдвиг - <)
Тогда заметим, что сборка не удается. Поэтому определено значение NS_BLOCK_ASSERTIONS
, значение NSAssert
s отключено.
Теперь, начиная с Xcode 6, настройка ENABLE_NS_ASSERTIONS
, которая установлена для 1
для конфигураций отладки и 0
для выпуска по умолчанию.
Вы можете выбрать его для выпуска в командной строке, передав аргумент ENABLE_NS_ASSERTIONS=1
, который я делаю для запуска модульных тестов, которые проверяют условия утверждения, но в противном случае должен запускаться с флагом DEBUG
.
Обновление: Проверено, что это работает в Xcode 8.
В Xcode 7 зайдите в настройки сборки проекта и найдите «Assert» в строке поиска. Это показывает раздел «Apple LLVM 7.0 - Предварительная обработка». Существует настройка под названием «Включить утверждения утверждений».
Я успешно включил/отключил NSAssert оттуда.
, который добавляет флаг 'ENABLE_NS_ASSERTIONS = NO;' в файл AppName.xcodeproj/project.pbxproj' приложения – computingfreak
Вот что я делаю в верхней части моего 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
будет действительным.)
Это, откровенно говоря, сумасшедший дизайн, который утверждает, что настройки по умолчанию не отключены. Мухи перед каждым другим компилятором, о котором я знаю. –
@SevaAlekseyev Согласитесь, мы получили шок, когда Assertions все еще прошли через Release. Совершенно нетрадиционно. Наша философия - «быстро развиваться, умереть в производстве». –