Dan*_*ark 50 assert objective-c
我最近读了两篇非常有趣的建议:
assert过NSAssert......没有任何理由不使用assert?(这不是字母:))sho*_*sti 56
回答你的两个问题:
除非断言中的实际操作耗时(例如assert([obj calculateMeaningOfLife] == 42)),否则在断言中留下的性能应该很小.断言应该与if性能方面的额外声明没有区别.在发布版本中删除断言的原因是它们本质上是一个调试工具 - 它们在运行时捕获不一致的内部程序状态.从开发人员的角度来看,一旦出现问题,应用程序崩溃会好得多,但从用户的角度来看,如果应用程序没有崩溃,可以说它不那么烦人(除非让应用程序以异常状态运行导致发生可怕的事情) ),并在错误消息中公开开发细节可能是令人反感的.双方都有很好的论据 - 如果我没记错的话,Code Complete建议将它们删除,但实用程序员建议将它们保留.在任何情况下,断言都不能代替正确的错误处理,只能用于编程错误.
an NSAssert和regular 之间的基本区别在于assert,NSAssert当一个assert只是崩溃应用程序失败时引发异常. NSAssert还允许您提供更高级的错误消息并记录它们.实际上,我真的不认为两者之间存在很大差异 - 我无法想到处理断言抛出的异常的理由.(为了分裂头发,我认为NSAssert通常涉及较少的打字,因为你不必包括assert.h,但这既不在这里也不在那里.)
NSAssert() 宏应该只在 Objective-C 方法中使用。
如果定义了预处理器宏 NS_BLOCK_ASSERTIONS(通常在发布版本中),则禁用 NSAssert()。