Какой смысл NSAssert, на самом деле?

Вы освободили свой мусор, в противном случае можно ли восстановить от мусора.

155
задан TheNeil 15 May 2019 в 17:40
поделиться

6 ответов

Утверждение позволяет убедиться, что значение соответствует предполагаемому. Если утверждение не выполняется, это означает, что что-то пошло не так, и приложение закрывается. Одна из причин для использования assert может заключаться в том, что у вас есть какая-то функция, которая не будет вести себя или будет создавать очень плохие побочные эффекты, если один из переданных ей параметров не совсем какое-то значение (или диапазон значений), вы можете поставить assert, чтобы сделать убедитесь, что это значение соответствует вашим ожиданиям, а если это не так, значит, что-то действительно не так, и приложение закрывается. Assert может быть очень полезным для отладки / модульного тестирования, а также когда вы предоставляете фреймворки, чтобы не дать пользователям делать «злые» вещи.

299
ответ дан 23 November 2019 в 21:54
поделиться

Помимо того, что все сказали выше, поведение по умолчанию NSAssert () (в отличие от C assert () ) - это исключение, которое можно поймать и обработать. Например, Xcode делает это.

17
ответ дан 23 November 2019 в 21:54
поделиться

Я не могу говорить с NSAssert, но полагаю, что он работает аналогично assert () в C.

assert () используется для принудительного выполнения семантического контракта в вашем коде. Что это значит, спросите вы?

Что ж, это как вы сказали: если у вас есть функция, которая никогда не должна получать -1, вы можете использовать assert () для принудительного выполнения этого:

void gimme_positive_ints(int i) {
  assert(i > 0);
}

И теперь вы увидите что-то подобное в журнале ошибок (или STDERR):

Assertion i > 0 failed: file example.c, line 2

Таким образом, он не только защищает от потенциально неправильных входных данных, но и регистрирует их полезным стандартным способом.

Да, по крайней мере, в C assert () был макросом, так что вы могли переопределить assert () как запретную операцию в вашем коде выпуска. Я не знаю, относится ли это к NSAssert (или даже к assert () больше), но было довольно полезно скомпилировать эти проверки.

20
ответ дан 23 November 2019 в 21:54
поделиться

Утверждения обычно используются для обеспечения предполагаемого использования определенного метода или части логики. Допустим, вы пишете метод, который вычисляет сумму двух целых чисел больше нуля. Чтобы убедиться, что метод всегда использовался по назначению, вы, вероятно, поставили бы утверждение, которое проверяет это условие.

Краткий ответ: они требуют, чтобы ваш код использовался только по назначению.

3
ответ дан 23 November 2019 в 21:54
поделиться

NSAssert (и его эквивалент в stdlib assert ) предназначены для обнаружения ошибок программирования во время разработки. У вас никогда не должно быть утверждения, которое не работает в производственном (выпущенном) приложении. Таким образом, вы можете утверждать, что никогда не передаете отрицательное число методу, требующему положительного аргумента. Если во время тестирования утверждение не удается, значит, у вас ошибка. Однако, если переданное значение вводится пользователем, вам необходимо выполнить правильную проверку ввода, а не полагаться на утверждение в производственной среде (вы можете установить #define для сборок выпуска, которые отключают NSAssert * .

6
ответ дан 23 November 2019 в 21:54
поделиться

Чтобы полностью ответить на его вопрос, смысл любого типа утверждения состоит в том, чтобы помочь отладке. Более ценно обнаруживать ошибки в их источнике, чем отлавливать их в отладчике, когда они вызывают сбои.

Например, вы можете передать значение функции, ожидающей значений в определенном диапазоне. Функция может сохранить значение для последующего использования, и при дальнейшем использовании приложение выйдет из строя. Стек вызовов, представленный в этом сценарии, не покажет источник неверного значения. Лучше поймать плохое значение, поскольку оно приходит, чтобы выяснить, кто передает плохое значение и почему.

2
ответ дан 23 November 2019 в 21:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: