最近,我阅读了两个非常有趣的建议:

  • 在对this StackOverflow answer的注释中,@ Mike Weller表示将您的主张留在生产代码中……这对性能有何影响?有什么理由不把他们留在里面吗?
  • Vincent Gable's blog中,他说您应该选择assert而不是NSAssert ...是否有理由不使用assert? (少于字母:))
  • 最佳答案

    要回答您的两个问题:

  • 除非在断言中实际执行操作很耗时(例如assert([obj calculateMeaningOfLife] == 42)),否则断言不会对性能造成太大影响。在性能方面,一个断言应该与一个额外的if语句没有什么不同。在发行版本中剔除断言的原因是它们本质上是一种调试工具-它们在运行时捕获不一致的内部程序状态。从开发人员的 Angular 来看,一旦出现问题,使应用程序崩溃会更好,但是从用户的 Angular 来看,如果应用程序不崩溃,则可以说烦人得多(除非让应用程序以异常状态运行会导致可怕的事情发生) ),并且在错误消息中公开开发细节可能会令人反感。双方都有很好的论点-如果我没记错的话,Code Complete建议将其删除,但The Pragmatic Programmer建议将其保留。无论如何,断言不能代替正确的错误处理,而只能用于编程错误。
  • NSAssert和常规assert之间的基本区别在于,当NSAssert失败而assert只是使应用程序崩溃时,它会引发异常。 NSAssert还允许您提供更详细的错误消息并进行记录。实际上,我真的认为两者之间没有太大区别-我想不出处理断言引发的异常的理由。 (要分开头发,我认为NSAssert通常涉及较少的键入操作,因为您不必包括assert.h,但这既不存在也不存在。)
  • 10-06 14:26