NS_BLOCK_ASSERTIONS в Objective-C
Я использую вызовы NSAssert() в приложении iPhone, и мое понимание из документов Apple заключается в том, что утверждения не скомпилированы в код, если определены NS_BLOCK_ASSERTIONS.
Чтобы отключить утверждения, в файле заголовка я объявляю: #define NS_BLOCK_ASSERTIONS
Однако код подтверждения все еще работает.
Есть ли что-то, что мне не хватает здесь?
Спасибо
Джон
Ответы
Ответ 1
Если вы создали проект Xcode на основе одного из стандартных шаблонов, заголовки Cocoa (включая NSException.h
, который содержит макросы NSAssert
), будут предварительно обработаны перед любыми другими файлами проекта. A #define NS_BLOCK_ASSERTIONS
в любом из заголовков проекта или файлов реализации поэтому не влияет на макросы NSAssert
.
Попробуйте поместить NS_BLOCK_ASSERTIONS
в макросы препроцессора вашего целевого или даже проекта (только для конфигурации выпуска):
![GCC_PREPROCESSOR_DEFINITIONS = NS_BLOCK_ASSERTIONS]()
Или поместите #define NS_BLOCK_ASSERTIONS
в заголовок префикса (.pch) перед строками #import <Cocoa/Cocoa.h>
или #import <Foundation/Foundation.h>
.
Ответ 2
Как упоминал @dwsolberg, Xcode имеет новую настройку сборки под названием ENABLE_NS_ASSERTIONS
. Для новых проектов его значение для конфигурации выпуска устанавливается равным NO
, а для всех остальных конфигураций - YES
. Вы можете использовать этот параметр, а также широко используемый подход NS_BLOCK_ASSERTIONS
, который все еще действует в Xcode 6.
![Preprocessor Macro Approach]()
![Foundation Assertion Build Setting]()
Утверждения - инструмент для отслеживания ошибок во время разработки и никогда не должны запускаться в продуктивном коде! Кроме того, исключения следует использовать только в том случае, если это абсолютно необходимо, т.е. Если что-то пошло так чертовски неправильно, что программа не может продолжить выполнение. Способ Cocoa - дать критическим методам логическое возвращаемое значение и параметризовать их с объектом ошибки, который может быть установлен внутри метода и может использоваться вне, если возвращаемое значение NO
.
Надеюсь, что это поможет некоторым людям; -)