最近我读到了两条非常有趣的建议:
- 在这个StackOverflow回答的评论中,@Mike Weller说在生产代码中留下你的断言…性能有什么影响?有什么理由不把它们留在里面吗?
- 在Vincent Gable的博客中,他说你应该更喜欢
assert
而不是NSAssert
…有什么理由不使用assert
吗?(小写字母:))
回答你的两个问题:
-
在断言中留下应该很少有性能损失,除非断言中的实际操作非常耗时(例如
assert([obj calculateMeaningOfLife] == 42)
)。在性能方面,断言应该与额外的if
语句没有什么不同。在发布版本中剥离断言的原因是,它们本质上是一种调试工具——它们在运行时捕获不一致的内部程序状态。从开发者的角度来看,一旦出现问题,应用就崩溃会更好,但从用户的角度来看,如果应用不会崩溃(除非让应用在异常状态下运行会导致一些可怕的事情发生),那么在错误信息中暴露开发细节可能会令人不快。双方都有很好的论据——如果我没记错的话,Code Complete建议去掉它们,但是The Pragmatic Programmer建议保留它们。在任何情况下,断言都不能代替正确的错误处理,只能用于编程错误。 -
NSAssert
和常规assert
之间的基本区别是,NSAssert
在失败时引发异常,而assert
只是使应用程序崩溃。NSAssert
还允许您提供更花哨的错误消息并记录它们。实际上,我真的不认为这两者之间有太大的区别——我想不出有什么理由处理由断言抛出的异常。(为了吹毛求疵,我认为NSAssert
通常涉及较少的输入,因为你不必包括assert.h
,但这既不是这里也不是那里。)
NSAssert()宏应该只在Objective-C方法中使用。
如果定义了预处理宏ns_block_断言(通常在发布版本中),NSAssert()被禁用。