我最近读了两篇非常有趣的建议:
assert
优先于NSAssert
...是否有任何理由不使用assert
? (这不是字母:))答案 0 :(得分:56)
回答你的两个问题:
除非断言中的实际操作耗时(例如assert([obj calculateMeaningOfLife] == 42)
),否则在断言中离开的性能应该非常小。在性能方面,断言应该与额外的if
语句没有区别。在发布版本中删除断言的原因是它们本质上是一个调试工具 - 它们在运行时捕获不一致的内部程序状态。从开发人员的角度来看,一旦出现问题,应用程序崩溃会好得多,但从用户的角度来看,如果应用程序没有崩溃,可以说它不那么烦人(除非让应用程序以异常状态运行导致发生可怕的事情) ),并在错误消息中公开开发细节可能是令人反感的。双方都有很好的论据 - 如果我没记错的话,代码完成建议剥离它们,但是实用程序员建议将它们留下。无论如何,断言不是替代正确的错误处理,只应用于编程错误。
NSAssert
和常规assert
之间的基本区别在于,NSAssert
在assert
崩溃应用时失败时会引发异常。 NSAssert
还允许您提供更高级的错误消息并记录它们。实际上,我真的不认为两者之间存在很大差异 - 我无法想到处理断言抛出的异常的理由。 (为了分割头发,我认为NSAssert
通常涉及较少的输入,因为您不必包含assert.h
,但这既不在这里也不在那里。)
答案 1 :(得分:4)
NSAssert()宏只能在Objective-C方法中使用。
如果定义了预处理器宏NS_BLOCK_ASSERTIONS(通常在发行版中),则禁用NSAssert()。