NSAssert与断言:您使用哪种,何时使用?

时间:2011-07-07 19:55:46

标签: objective-c assert

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

  1. 在对this StackOverflow answer的评论中,@ Mike Weller说要在生产代码中留下你的断言......性能受到了什么影响,真的吗?有什么理由不让他们进去吗?
  2. Vincent Gable's blog中,他声明您应该assert优先于NSAssert ...是否有任何理由不使用assert? (这不是字母:))

2 个答案:

答案 0 :(得分:56)

回答你的两个问题:

  1. 除非断言中的实际操作耗时(例如assert([obj calculateMeaningOfLife] == 42)),否则在断言中离开的性能应该非常小。在性能方面,断言应该与额外的if语句没有区别。在发布版本中删除断言的原因是它们本质上是一个调试工具 - 它们在运行时捕获不一致的内部程序状态。从开发人员的角度来看,一旦出现问题,应用程序崩溃会好得多,但从用户的角度来看,如果应用程序没有崩溃,可以说它不那么烦人(除非让应用程序以异常状态运行导致发生可怕的事情) ),并在错误消息中公开开发细节可能是令人反感的。双方都有很好的论据 - 如果我没记错的话,代码完成建议剥离它们,但是实用程序员建议将它们留下。无论如何,断言不是替代正确的错误处理,只应用于编程错误。

  2. NSAssert和常规assert之间的基本区别在于,NSAssertassert崩溃应用时失败时会引发异常。 NSAssert还允许您提供更高级的错误消息并记录它们。实际上,我真的不认为两者之间存在很大差异 - 我无法想到处理断言抛出的异常的理由。 (为了分割头发,我认为NSAssert通常涉及较少的输入,因为您不必包含assert.h,但这既不在这里也不在那里。)

答案 1 :(得分:4)

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

如果定义了预处理器宏NS_BLOCK_ASSERTIONS(通常在发行版中),则禁用NSAssert()。