Что такое NSParameterAssert?


Ответы:


115

Это простой способ проверить, что параметр метода не равен нулю nilили не равен нулю. По сути, вы используете его для создания предварительного условия, заявляя, что какой-то параметр должен быть установлен. Если он не установлен, макрос вызывает прерывание приложения и генерирует ошибку в этой строке. Так:

- (void)someMethod:(id)someObjectThatMustNotBeNil
{
  // Make sure that someObjectThatMustNotBeNil is really not nil
  NSParameterAssert( someObjectThatMustNotBeNil );
  // Okay, now do things
}

Предварительные условия - это простой способ убедиться, что методы / API вызываются программистом правильно. Идея состоит в том, что если программист нарушает предварительное условие, приложение завершает работу раньше времени - надеюсь, во время отладки и базового тестирования.

NSParameterAssert Однако можно использовать для проверки того, что любое выражение оценивается как истинное, поэтому вы также можете использовать его следующим образом:

NSParameterAssert( index >= 0 ); // ensure no negative index is supplied

Документация Apple для макроса NSParameterAssert ()


1
Обязательно перехватывайте исключения в своем коде, иначе, если Assert истинно, это приведет к сбою вашего приложения.
lucius

14
@lucius: утверждения не должны использоваться для проверки условий в распределенном приложении, они нужны для выявления ошибок во время разработки. Причинение чего-либо сбоя в плохом состоянии (например, неподключенной розетки к Nib) вместо того, чтобы молча вывести из строя, позволяет обнаружить проблемы на ранней стадии. Многие люди отключают их во время распространения с помощью макросов или #ifdef.
Брэд Ларсон

5
@lucius - цель состоит в том, чтобы вызвать прерывание работы приложения, если предварительные условия не выполнены. Это позволяет программисту сразу узнать, что он сделал что-то не так. Чтобы гарантировать, что утверждения в Какао не оцениваются, вы можете определить макрос NS_BLOCK_ASSERTIONS. Это отключает их, но идея состоит в том, чтобы предотвратить выполнение побочных эффектов или медленного кода, а не в защите от сбоев - при правильном использовании утверждения никогда не должны срабатывать.
Джейсон Коко,

1
Можно ли удалить эти утверждения простым способом при создании производственных сборок. IMHO, их лучше всего использовать во время разработки, чтобы отловить ошибки программирования (как указано в комментарии выше).
Йохан Карлссон

5
@JohanKarlsson Это возможно и установлено по умолчанию в текущих версиях шаблонов (это довольно давно) в Releaseконфигурации. Вы можете управлять этим, установив параметры ENABLE_NS_ASSERTIONSсборки в более новых версиях Xcode или определив NS_BLOCK_ASSERTIONSмакрос и установив для него значение 1. В Xcode 5 есть параметр проекта * Enable Foundation Assertions`, который устанавливает параметр сборки и по умолчанию принимает значения Yesin Debugи Noin. Releaseконфигурации.
Джейсон Коко,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.