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