NSAssert против assert: что вы используете и когда? - PullRequest
49 голосов
/ 07 июля 2011

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

  1. В комментариях к этому ответу StackOverflow , @Mike Weller говорит, чтобы оставить ваши утверждения в работекод ... что на самом деле удар по производительности?Есть ли причина НЕ оставлять их?
  2. В блоге Винсента Гейбла он заявляет, что вы должны предпочесть assert вместо NSAssert ... есть ли причина НЕ использовать assert?(меньше букв :))

Ответы [ 2 ]

56 голосов
/ 08 июля 2011

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

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

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

4 голосов
/ 25 октября 2011

Макрос NSAssert () следует использовать только в методах Objective-C.

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

...