目标C语言 NSAssert和assert:你用哪个,什么时候用



最近我读到了两条非常有趣的建议:

  1. 在这个StackOverflow回答的评论中,@Mike Weller说在生产代码中留下你的断言…性能有什么影响?有什么理由不把它们留在里面吗?
  2. 在Vincent Gable的博客中,他说你应该更喜欢assert而不是NSAssert…有什么理由不使用assert吗?(小写字母:))

回答你的两个问题:

  1. 在断言中留下应该很少有性能损失,除非断言中的实际操作非常耗时(例如assert([obj calculateMeaningOfLife] == 42))。在性能方面,断言应该与额外的if语句没有什么不同。在发布版本中剥离断言的原因是,它们本质上是一种调试工具——它们在运行时捕获不一致的内部程序状态。从开发者的角度来看,一旦出现问题,应用就崩溃会更好,但从用户的角度来看,如果应用不会崩溃(除非让应用在异常状态下运行会导致一些可怕的事情发生),那么在错误信息中暴露开发细节可能会令人不快。双方都有很好的论据——如果我没记错的话,Code Complete建议去掉它们,但是The Pragmatic Programmer建议保留它们。在任何情况下,断言都不能代替正确的错误处理,只能用于编程错误。

  2. NSAssert和常规assert之间的基本区别是,NSAssert在失败时引发异常,而assert只是使应用程序崩溃。NSAssert还允许您提供更花哨的错误消息并记录它们。实际上,我真的不认为这两者之间有太大的区别——我想不出有什么理由处理由断言抛出的异常。(为了吹毛求疵,我认为NSAssert通常涉及较少的输入,因为你不必包括assert.h,但这既不是这里也不是那里。)

NSAssert()宏应该只在Objective-C方法中使用。

如果定义了预处理宏ns_block_断言(通常在发布版本中),

NSAssert()被禁用。

相关内容

  • 没有找到相关文章

最新更新