NS_BLOCK_ASSERTIONS в Objective-C - PullRequest
37 голосов
/ 22 июня 2011

Я использую вызовы NSAssert () в приложении iPhone, и, насколько я понимаю из документов Apple, утверждения не скомпилированы в код, если определено NS_BLOCK_ASSERTIONS.

Чтобы отключить утверждения, в заголовочном файле я объявляю: #define NS_BLOCK_ASSERTIONS

Однако код подтверждения по-прежнему работает.

Есть ли что-то, чего мне здесь не хватает?

Спасибо

John

Ответы [ 2 ]

60 голосов
/ 22 июня 2011

Если вы создали свой проект Xcode на основе одного из стандартных шаблонов, заголовки Cocoa (включая NSException.h, который содержит макросы NSAssert) будут предварительно обработаны перед любыми другими файлами в проекте. Поэтому #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>.

13 голосов
/ 10 октября 2014

Как уже упоминалось @dwsolberg, в Xcode есть новый параметр сборки, который называется ENABLE_NS_ASSERTIONS. Для новых проектов его значение для конфигурации выпуска установлено на NO, а для всех других конфигураций на YES. Вы можете использовать этот параметр, а также широко используемый подход NS_BLOCK_ASSERTIONS, который все еще действует в Xcode 6.

Preprocessor Macro Approach

Foundation Assertion Build Setting

Утверждения являются инструментом для отслеживания ошибок во время разработки и никогда не должны запускаться в производительном коде! Также исключения следует использовать только в том случае, если это абсолютно необходимо, то есть, если что-то пошло так чертовски неправильно, что программа не может продолжить выполнение. Способ Какао состоит в том, чтобы дать критическим методам логическое возвращаемое значение и параметризовать их с помощью объекта ошибки, который может быть установлен внутри метода и может использоваться снаружи, если возвращаемое значение равно NO.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...