Я должен спросить это, потому что: Единственное, что я узнаю, это то, что, если утверждение не выполняется, приложение падает. Это причина, почему использовать NSAssert? Или какая еще польза от этого? И правильно ли ставить NSAssert чуть выше любого предположения, которое я делаю в коде, например, функцию, которая никогда не получит -1 в качестве параметра, но может быть -0,9 или -1,1?
155
Я не могу говорить с NSAssert, но я представляю, что он работает аналогично assert () в C.
assert () используется для обеспечения семантического контракта в вашем коде. Вы спросите, что это значит?
Что ж, это как вы сказали: если у вас есть функция, которая никогда не должна получать -1, вы можете использовать assert (), чтобы:
И теперь вы увидите что-то вроде этого в журнале ошибок (или STDERR):
Таким образом, он не только защищает от потенциально плохих входных данных, но и регистрирует их полезным, стандартным способом.
Да, и по крайней мере в C assert () был макрос, так что вы можете переопределить assert () как запрет на использование в вашем коде релиза. Я не знаю, так ли это с NSAssert (или даже с assert ()), но было довольно полезно скомпилировать эти проверки.
источник
NSAssert
дает вам больше, чем просто сбой приложения. Он сообщает вам класс, метод и строку, где произошло утверждение. Все утверждения также могут быть легко деактивированы с помощью NS_BLOCK_ASSERTIONS. Таким образом, делая его более подходящим для отладки. С другой стороны, выбрасывание приложения приводит кNSException
сбою приложения. Это также не говорит о местонахождении исключения, и при этом это не может быть отключено так просто. Смотрите разницу в изображениях ниже.Приложение падает, потому что утверждение также вызывает исключение, как указано в документации NSAssert :
NSAssert:
NSException:
источник
NSException
Предоставляет множество возможностей для настройки выходного сигнала он возвращается поreason
иuserInfo
параметрам. Нет причин, по которым вы не можете добавить имя класса, селектор, информацию о строке и все, что вы хотите добавить, чтобы помочь в отладке. ИМХО, вы используетеNSAssert
для целей отладки во время разработки, но отключаете их для отправки; Вы бросаете,NSException
если хотите оставить в утверждении в коде доставки.Помимо того, что все говорили выше, стандартное поведение
NSAssert()
(в отличие от Cassert()
) - генерировать исключение, которое вы можете перехватить и обработать. Например, Xcode делает это.источник
Просто чтобы прояснить, как кто-то упомянул, но не полностью объяснил, причина наличия и использования утверждений вместо простого создания пользовательского кода (например, выполнение if и повышение исключения для неверных данных) состоит в том, что утверждения СЛЕДУЕТ отключать для производственных приложений.
Во время разработки и отладки вы можете отслеживать ошибки. Программа остановится, когда утверждение будет оценено как ложное. Но при компиляции для производства компилятор пропускает код подтверждения и фактически делает вашу программу запущенной быстрее. К тому времени, надеюсь, вы исправили все ошибки. Если ваша программа все еще имеет ошибки во время работы (когда утверждения отключены и программа «пропускает» утверждения), ваша программа, вероятно, завершится сбоем в какой-то другой точке.
Из справки NSAssert: «Утверждения отключены, если определен макрос препроцессора NS_BLOCK_ASSERTIONS». Итак, просто поместите макрос в вашу цель распространения [только].
источник
NSAssert
(и его эквивалент stdlibassert
) предназначены для обнаружения ошибок программирования во время разработки. Вы никогда не должны иметь утверждение, которое терпит неудачу в производственном (выпущенном) приложении. Таким образом, вы можете утверждать, что никогда не передаете отрицательное число методу, который требует положительного аргумента. Если утверждение когда-либо не выполняется во время тестирования, у вас есть ошибка. Однако, если переданное значение вводится пользователем, вам необходимо выполнить правильную проверку входных данных, а не полагаться на утверждение в работе (вы можете установить #define для сборок релизов, которые отключаютNSAssert*
.источник
Утверждения обычно используются для обеспечения предполагаемого использования определенного метода или части логики. Допустим, вы писали метод, который вычисляет сумму двух целых чисел больше нуля. Чтобы убедиться, что метод всегда использовался по назначению, вы, вероятно, добавили бы утверждение, которое проверяет это условие.
Краткий ответ: они обеспечивают использование вашего кода только по назначению.
источник
Стоит отметить, что помимо проверки во время выполнения, программирование утверждений является важным средством, используемым при разработке кода по контракту.
Более подробную информацию о предмете утверждения и дизайна по контракту можно найти ниже:
Утверждение (разработка программного обеспечения)
Дизайн по контракту
Программирование с утверждениями
Дизайн по контракту, по примеру [Мягкая обложка]
источник
Чтобы полностью ответить на его вопрос, смысл любого типа утверждения состоит в том, чтобы помочь отладке. Более ценно отлавливать ошибки в их источнике, а затем отлавливать их в отладчике, когда они вызывают сбои.
Например, вы можете передать значение функции, ожидающей значения в определенном диапазоне. Функция может сохранить значение для последующего использования, а при последующем использовании происходит сбой приложения. Стек вызовов, видимый в этом сценарии, не будет показывать источник неверного значения. Лучше поймать плохое значение, когда оно приходит, чтобы узнать, кто передает плохое значение и почему.
источник
NSAssert
сделать сбой приложения, когда оно соответствует условию. Если не совпадают с условием, будут выполнены следующие операторы. Посмотрите на EX ниже:Я просто создаю приложение, чтобы проверить, что является задачей
NSAssert
:в моем коде приложение не будет аварийно завершено. И контрольный пример:
anNum
> = 2 -> Приложение не завершится сбоем, и вы увидите строку журнала: «Этот оператор будет выполняться при anNum <2» в окне консоли журнала outPutanNum
<2 -> Приложение аварийно завершает работу, и вы не видите строку журнала: «Этот оператор будет выполняться, когда anNum <2»источник