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

Я должен спросить об этом, потому что: Единственное, что я признаю, это то, что если утверждение не удастся, приложение выйдет из строя. Это причина использования NSAssert? Или что еще это выгодно? И правильно ли поставить NSAssert чуть выше любого предположения, которое я делаю в коде, как функция, которая никогда не должна получать -1 как параметр, но может -0.9 или -1.1?

Ответ 1

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

Ответ 2

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

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

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

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

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

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

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

О, и, по крайней мере, в C assert() был макрос, поэтому вы можете переопределить assert() как no-op в своем коде выпуска. Я не знаю, было ли это в случае с NSAssert (или даже assert()), но было очень полезно скомпилировать эти проверки.

Ответ 3

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

Ответ 4

NSAssert дает вам больше, чем просто сбой приложения. Он сообщает вам класс, метод и строку, в которой произошло это утверждение. Все утверждения можно также легко отключить, используя NS_BLOCK_ASSERTIONS. Это делает его более подходящим для отладки. С другой стороны, сброс приложения NSException приведет к сбою приложения. Он также не говорит о местонахождении исключения и не может быть так просто отключен. См. Разницу в изображениях ниже.

Приложение вылетает из-за того, что утверждение также вызывает исключение, поскольку в документации NSAssert указано:

При вызове обработчик утверждения выводит сообщение об ошибке включает имена методов и классов (или имя функции). Тогда вызывает исключение исключения NSInternalInconsistencyException.

NSAssert:

Logs after an assertion

NSException:

Logs after an exception

Ответ 5

Просто, чтобы уточнить, как кто-то упомянул, но не полностью объяснил, причина наличия и использования утверждений вместо создания собственного кода (например, ifs и создание исключения для плохих данных) заключается в том, что утверждения ДОЛЖНЫ быть отключены для производства приложения.

При разработке и отладке, вы можете обнаруживать ошибки. Программа будет остановлена, когда утверждение будет оценено как false. Но при компиляции для производства компилятор опускает код утверждения и фактически ДЕЛАЕТ ВАШУ ПРОГРАММУ RUN FASTER. К тому времени, надеюсь, вы исправили все ошибки. Если ваша программа все еще имеет ошибки во время производства (когда утверждения отключены и программа "проскакивает" над утверждениями), ваша программа, вероятно, закончит сбой в какой-то другой точке.

Из справки NSAssert: "Утверждения отключены, если определен макрос препроцессора NS_BLOCK_ASSERTIONS". Итак, просто поместите макрос в свой целевой объект распространения [только].

Ответ 6

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

Ответ 7

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

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

Ответ 8

Стоит отметить, что помимо проверки во время выполнения, программирование утверждений является важным средством, используемым при разработке кода по контракту.

Более подробную информацию о предмете утверждения и дизайна по контракту можно найти ниже:

Утверждение (разработка программного обеспечения)

Дизайн по контракту

Программирование с утверждениями

Дизайн по контракту, по примеру [Мягкая обложка]

Ответ 9

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

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

Ответ 10

NSAssert сделать приложение сбоем, когда оно соответствует условию. Если не совпадают с условием выполнения следующих операторов. Найдите EX ниже:

Я просто создаю приложение для проверки того, что является задачей NSAssert:

    - (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self testingFunction:2];
}

-(void)testingFunction: (int)anNum{
    // if anNum < 2 -> the app will crash
    // and the NSLog statement will not execute
    // that mean you cannot see the string: "This statement will execute when anNum < 2"
    // into the log console window of Xcode
    NSAssert(anNum >= 2, @"number you enter less than 2");
    // If anNum >= 2 -> the app will not crash and the below 
    // statement will execute
    NSLog(@"This statement will execute when anNum < 2");
}

в мой код приложение не будет разбиваться. И тестовый пример:

  • anNum >= 2 → Приложение не будет разбиваться, и вы увидите строку журнала: "Этот оператор будет выполняться, когда anNum < 2" в окне консоли журнала outPut
  • anNum < 2 → Приложение выйдет из строя, и вы не увидите строку журнала: "Этот оператор будет выполняться, когда anNum < 2"