156 iphone cocoa-touch uikit ios nsassert
我不得不问这个,因为:我唯一认识到的是,如果断言失败,应用程序崩溃了.这就是使用NSAssert的原因吗?或者还有什么好处呢?将NSAssert放在我在代码中做出的任何假设之上是正确的,比如一个函数应该永远不会接收-1作为参数,但可能是-0.9或-1.1?
Dan*_*iel 300
断言是确保一个值应该是它应该是什么.如果断言失败意味着出现问题,那么应用就会退出.使用assert的一个原因是,如果你有一些不起作用的函数,或者如果传递给它的一个参数不完全是某个值(或一系列值),你可以创建一个非常不好的副作用确保这个价值是你所期望的,如果不是,那么事情确实是错的,所以应用程序退出了.断言对于调试/单元测试非常有用,当你提供框架来阻止用户做"邪恶"的事情时也是如此.
Man*_*lla 20
我无法真正与NSAssert交谈,但我想它与C的assert()类似.
assert()用于在代码中强制执行语义合约.这是什么意思,你问?
好吧,就像你说的那样:如果你有一个永远不会收到-1的函数,你可以让assert()强制执行:
void gimme_positive_ints(int i) {
assert(i > 0);
}
现在你会在错误日志(或STDERR)中看到类似的东西:
Assertion i > 0 failed: file example.c, line 2
因此,它不仅能够安全防范潜在的不良输入,而且还能以有用的标准方式记录它们.
哦,至少在C中,assert()是一个宏,所以你可以在你的发布代码中将assert()重新定义为no-op.我不知道NSAssert是否就是这种情况(或者甚至是assert()),但编译这些检查非常有用.
Abd*_*Ali 16
NSAssert为您提供的不仅仅是崩溃应用程序.它告诉您类,方法和断言发生的行.使用NS_BLOCK_ASSERTIONS也可以轻松地停用所有断言.从而使其更适合调试.另一方面,投掷NSException只会崩溃应用程序.它也没有告诉异常的位置,也不能简单地禁用它.请参阅下图中的差异.
应用程序崩溃,因为断言也会引发异常,因为NSAssert文档指出:
调用时,断言处理程序会输出包含方法和类名(或函数名)的错误消息.然后它引发一个NSInternalInconsistencyException异常.
NSAssert:

NSException:

只是为了澄清,正如有人提到但没有完全解释的那样,拥有和使用断言而不仅仅是创建自定义代码(例如,为坏数据做ifs和引发异常)的原因是应该为生产应用程序禁用断言.
在开发和调试时,会启用断言以捕获错误.当断言被评估为false时,程序将暂停.但是,在编译生产时,编译器会省略断言代码并实际上使您的程序运行更快.到那时,希望你已经修复了所有错误.如果您的程序在生产中仍然存在错误(当断言被禁用并且程序"跳过"断言时),您的程序可能最终会在某个其他点崩溃.
从NSAssert的帮助:"如果定义了预处理器宏NS_BLOCK_ASSERTIONS,则禁用断言." 所以,只需将宏放在您的分发目标中[仅].
NSAssert(及其stdlib等价物assert)用于检测开发期间的编程错误.您永远不应该在生产(已发布)应用程序中出现失败的断言.因此,您可能断言您永远不会将负数传递给需要正参数的方法.如果断言在测试期间失败,那么您就有一个错误.但是,如果用户输入了传递的值,则需要对输入进行适当的验证,而不是依赖生产中的断言(可以为禁用的版本构建设置#define NSAssert*.
| 归档时间: |
|
| 查看次数: |
67310 次 |
| 最近记录: |