我必须这样问,因为:我唯一认识到的是,如果断言失败,应用程序就会崩溃。这是使用NSAssert的原因吗?或者它还有什么好处呢?将NSAssert放在我在代码中所做的任何假设之上是正确的吗,比如一个函数永远不应该将-1作为参数,而可能是-0.9或-1.1?
发布于 2009-09-03 20:39:13
断言是为了确保一个值是它应该是的值。如果断言失败,这意味着出了问题,因此应用程序退出。使用assert的一个原因是,如果你有一些函数不会运行,或者会产生非常糟糕的副作用如果传递给它的一个参数不是确切的某个值(或一个值的范围),你可以放一个assert来确保这个值是你期望的值,如果不是,那么一定是什么东西真的出错了,所以应用程序退出。Assert对于调试/单元测试非常有用,当您提供框架来阻止用户做“邪恶”的事情时也是如此。
发布于 2009-09-03 21:01:54
除了上面每个人所说的,NSAssert()的默认行为(与C的assert()不同)是抛出一个异常,您可以捕获和处理该异常。例如,Xcode就是这样做的。
发布于 2010-09-23 00:02:11
只是为了澄清一下,正如有人提到但没有完全解释的那样,拥有和使用断言而不是仅仅创建自定义代码(例如,执行if并为坏数据引发异常)的原因是,应该为生产应用程序禁用断言。
在开发和调试时,可以使用断言来捕获错误。当assert被评估为false时,程序将暂停。但是,在为生产环境进行编译时,编译器省略了断言代码,实际上会使程序运行得更快。到那时,希望你已经修复了所有的bug。如果您的程序在生产过程中仍然有bug(当断言被禁用并且程序“跳过”断言时),您的程序很可能会在其他某个时刻崩溃。
来自NSAssert的帮助:“如果定义了预处理器宏NS_BLOCK_ASSERTIONS,则禁用断言。”因此,只需将宏放入您的分布目标中即可。
https://stackoverflow.com/questions/1375786
复制相似问题