最近我读了两条非常有趣的建议:
- 在对this StackOverflow answer的 comments 中,@Mike Weller说在生产代码中保留您的断言...什么是表演热门,真的吗?有什么理由不把它们留在家里吗?
- 在Vincent Gable's blog中,他说你应该更喜欢
assert
而不是NSAssert
...有什么理由不使用assert
吗?(少了几个字母:))
最近我读了两条非常有趣的建议:
assert
而不是NSAssert
...有什么理由不使用assert
吗?(少了几个字母:))回答两个问题:
除非断言中的实际操作非常耗时(例如assert([obj calculateMeaningOfLife] == 42)
),否则在断言中离开应该不会对性能造成太大影响.就性能而言,断言应该与额外的if
语句没有什么不同.在发布版本中剥离断言的原因是,它们本质上是一种调试工具——它们在运行时捕获不一致的内部程序状态.从开发人员的Angular 来看,一个应用程序一旦出现问题就崩溃要好得多,但从用户的Angular 来看,如果应用程序不崩溃(除非让应用程序在异常状态下运行会导致可怕的事情发生),那么可以说不那么恼人,并且在错误消息中expose 开发细节可能会令人不快.双方都有很好的论据——如果我没记错的话,Code Complete建议go 掉它们,而The Pragmatic Programmer建议保留它们.在任何情况下,断言都不能代替正确的错误处理,只能用于编程错误.
NSAssert
和普通assert
的基本区别在于,当NSAssert
失败时会引发异常,而assert
只是使应用程序崩溃.NSAssert
还允许您提供更有趣的错误消息并记录它们.实际上,我真的不认为两者之间有太大区别——我想不出处理断言引发的异常的理由.(我认为NSAssert
通常需要更少的打字,因为你不必包括assert.h
,但这既不重要也不重要.)