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.

Надеюсь, что это поможет некоторым людям; -)