Подтвердить что ты не робот

NSAssert vs. assert: что вы используете и когда?

Недавно я прочитал два действительно интересных совета:

  • В комментариях к qaru.site/info/40466/..., @Майк Уэллер говорит, чтобы оставить ваши утверждения в производственном кодексе... что действительно поразило производительность? Есть ли какая-то причина НЕ оставлять их?
  • В блог Vincent Gable, он утверждает, что вы должны предпочесть assert над NSAssert... есть ли какая-то причина НЕ использовать assert? (это меньше букв:))
4b9b3361

Ответ 1

Чтобы ответить на два вопроса:

  • В утверждении должно быть очень мало производительности, если фактическое действие в утверждении не занимает много времени (например, assert([obj calculateMeaningOfLife] == 42)). Утверждение не должно отличаться от дополнительного выражения if, с точки зрения производительности. Причина снятия утверждений в сборках релизов заключается в том, что они по сути являются средством отладки - они во время выполнения обнаруживают несогласованное внутреннее состояние программы. С точки зрения разработчика, гораздо лучше для приложения сбой, как только что-то пойдет не так, но с точки зрения пользователя это, возможно, менее раздражает, если приложение не сбой (если только запуск приложения с ненормальным состоянием не приведет к чему-то ужасному), и разоблачение деталей разработки в сообщениях об ошибках может быть отключено. Есть хорошие аргументы в обеих сторонах - если я правильно помню, Code Complete рекомендует удалить их, но программист Pragmatic рекомендует оставить их. В любом случае утверждения не заменят правильную обработку ошибок и должны использоваться только для ошибок программирования.

  • Основное отличие между NSAssert и регулярным assert заключается в том, что NSAssert вызывает исключение, когда он терпит неудачу, а assert просто сбой приложения. NSAssert также позволяет вам отправлять сообщения об ошибках и записывать их в журнал. Практически, я действительно не думаю, что существует большая разница между ними - я не могу придумать причину для обработки исключения, вызванного утверждением. (Чтобы разделить волосы, я думаю, что NSAssert обычно включает в себя меньше набора текста, потому что вам не нужно включать assert.h, но это ни здесь, ни там.)

Ответ 2

Макрос NSAssert() должен использоваться только в Objective-C.

NSAssert() отключен, если макрос препроцессора NS_BLOCK_ASSERTIONS определен (обычно в версии выпуска).