Недавно я прочитал два действительно интересных совета:
assert
NSAssert
Чтобы ответить на два ваших вопроса:
Уход в утверждении должен быть очень слабым, если только фактическое действие в утверждении не занимает много времени (например, assert([obj calculateMeaningOfLife] == 42)). Утверждение не должно отличаться от дополнительного оператора if с точки зрения производительности. Причина удаления утверждений в сборках релизов заключается в том, что они по сути являются инструментом отладки - они улавливают несовместимое внутреннее состояние программы во время выполнения. С точки зрения разработчика, гораздо лучше для приложения аварийно завершить работу, если что-то пойдет не так, но с точки зрения пользователя это, возможно, менее раздражает, если приложение не аварийно завершает работу (если только запуск приложения с ненормальным состоянием не вызовет чего-то ужасного) ), и разоблачение деталей разработки в сообщениях об ошибках может быть утомительным. Есть веские аргументы с обеих сторон - если я правильно помню, Code Complete рекомендует их убрать, но Прагматичный программист рекомендует оставить их внутри. В любом случае утверждения не являются заменой для правильной обработки ошибок и должен использоваться только для ошибок программирования.
assert([obj calculateMeaningOfLife] == 42)
if
Основное различие между NSAssert и обычным assert состоит в том, что NSAssert вызывает исключение при сбое, а assert просто вызывает сбой приложения. NSAssert также позволяет вам выдавать необычные сообщения об ошибках и регистрировать их. Практически, я действительно не думаю, что между ними есть большая разница - я не могу придумать причину для обработки исключения, выдвигаемого утверждением. (Я думаю, что для раскола волос NSAssert обычно требуется меньше печатать, потому что вам не нужно включать assert.h, но это не здесь и не там.)
assert.h
Макрос NSAssert () следует использовать только в методах Objective-C.
NSAssert () отключается, если определен макрос препроцессора NS_BLOCK_ASSERTIONS (обычно в версии выпуска).