NSAssert与assert:你使用哪个,什么时候?

最近我读了两篇非常有意思的build议:

  1. 在对这个StackOverflow答案的评论中,@Mike Weller说要把你的断言放在生产代码中…真的是什么性能打击? 有什么理由不让他们进来吗?
  2. 在文森特·盖博的博客中 ,他表示你应该更喜欢assert NSAssert …是否有任何理由不使用assert ? (这是更less的信件:))

回答你的两个问题:

  1. 除非断言中的实际操作耗时(例如assert([obj calculateMeaningOfLife] == 42) ),否则在断言中应该只有很小的性能assert([obj calculateMeaningOfLife] == 42) 。 一个断言应该与一个额外的if语句无异,在性能方面。 在发布版本中剥离断言的原因是它们本质上是一个debugging工具 – 它们在运行时捕获到不一致的内部程序状态。 从开发人员的angular度来看,一旦出现问题,应用程序就会崩溃,但是从用户angular度来看,如果应用程序不会崩溃,则可以说这样做不那么麻烦(除非让应用程序以exception状态运行,导致可怕的事情发生),并且在错误消息中暴露开发细节可能是错误的。 双方都有很好的论点 – 如果我没有记错的话, Code Completebuild议将它们除掉,但是Pragmatic Programmerbuild议将它们留在其中。在任何情况下,断言都不能取代正确的error handling,只能用于编程错误。

  2. NSAssert和常规assert之间的基本区别在于,当一个assert导致应用程序崩溃时, NSAssert发生exception。 NSAssert也可以让你提供更好的错误信息并logging下来。 实际上,我真的不认为两者之间有太大的区别 – 我想不出一个理由来处理由断言引发的exception。 (为了分割头发,我认为NSAssert通常会涉及更less的键入,因为您不必包含assert.h ,但这不是在这里,也不在那里)。

NSAssert()macros只能在Objective-C方法中使用。

如果定义了预处理器macrosNS_BLOCK_ASSERTIONS(通常在发行版本中),NSAssert()将被禁用。