Answers:
断言是要确保值是应该的值。如果断言失败,则意味着出现了问题,因此应用程序退出。使用assert的原因之一是,如果传递给它的参数之一不是某个值(或一系列值),则您可以使用某些函数将不起作用或会产生非常严重的副作用,可以使用assert来进行确保该值就是您期望的值,如果不是,则说明确实存在错误,因此该应用程序退出。断言对于调试/单元测试以及提供阻止用户执行“邪恶”操作的框架非常有用。
我真的不能和NSAssert交谈,但是我认为它的工作方式与C的assert()类似。
assert()用于在代码中强制执行语义约定。你问什么意思?
好吧,就像您说的那样:如果您有一个永远不应该收到-1的函数,则可以使assert()强制执行以下操作:
void gimme_positive_ints(int i){ 断言(i> 0); }
现在,您将在错误日志(或STDERR)中看到以下内容:
断言i> 0失败:文件example.c,第2行
因此,它不仅可以安全防范潜在的不良输入,而且还可以以一种有用的标准方式记录它们。
哦,至少在C中assert()是一个宏,因此您可以在发布代码中将assert()重新定义为no-op。我不知道NSAssert是否是这种情况(甚至不再是assert()),但是编译出这些检查非常有用。
NSAssert
给您带来的不仅仅是崩溃应用程序。它告诉您断言的类,方法和行。还可以使用NS_BLOCK_ASSERTIONS轻松停用所有断言。从而使其更适合调试。另一方面,NSException
仅抛出则会使应用程序崩溃。它也不能告知异常的位置,也不能如此简单地将其禁用。请参见以下图片中的区别。
应用程序崩溃,因为声明也引发了异常,如NSAssert文档所述:
调用时,断言处理程序将打印一条错误消息,其中包括方法和类名(或函数名)。然后,它引发一个NSInternalInconsistencyException异常。
NSAssert:
NSException:
NSException
提供了很多机会来定制通过reason
和userInfo
参数返回的输出。没有理由不添加类名,选择器,行信息以及您想要添加以帮助调试的其他任何内容。恕我直言,您可以NSAssert
在开发过程中将用作调试目的,但禁用它们;NSException
如果要保留运输代码中的断言,则抛出。
正如有人提到但没有完全解释的那样,为了澄清,拥有和使用断言而不是仅创建自定义代码(例如,对不良数据进行ifs和引发异常)的原因是,对于生产应用程序应禁用断言。
在开发和调试时,将启用断言以捕获错误。当断言被评估为false时,程序将停止。但是,在进行生产编译时,编译器会忽略断言代码,并实际上使您的程序运行更快。到那时,希望您已经修复了所有错误。如果您的程序在生产中仍然存在错误(当断言被禁用并且程序“跳过”断言时),您的程序可能会在其他时候崩溃。
来自NSAssert的帮助:“如果定义了预处理程序宏NS_BLOCK_ASSERTIONS,则将禁用断言。” 因此,只需将宏放入您的分发目标中(仅)。
NSAssert
(及其等效的stdlib assert
)用于在开发过程中检测编程错误。在生产(已发布)的应用程序中,永远不要有失败的断言。因此,您可能会断言,永远不要将负数传递给需要正数的方法。如果断言在测试期间失败,则说明您有错误。但是,如果传递的值是由用户输入的,则需要对输入进行适当的验证,而不是依赖生产中的断言(您可以为#build设置禁用的release构建NSAssert*
。
NSAssert
符合条件时使应用程序崩溃。如果不符合条件,将执行下一条语句。在下面查找EX:
我只是创建一个应用程序来测试的任务NSAssert
是:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self testingFunction:2];
}
-(void)testingFunction: (int)anNum{
// if anNum < 2 -> the app will crash
// and the NSLog statement will not execute
// that mean you cannot see the string: "This statement will execute when anNum < 2"
// into the log console window of Xcode
NSAssert(anNum >= 2, @"number you enter less than 2");
// If anNum >= 2 -> the app will not crash and the below
// statement will execute
NSLog(@"This statement will execute when anNum < 2");
}
进入我的代码后,该应用程序将不会崩溃。测试用例为:
anNum
> = 2->应用程序将不会崩溃,并且您可以在outPut日志控制台窗口中看到日志字符串:“当anNum <2时将执行此语句”anNum
<2->应用程序将崩溃,并且您无法看到日志字符串:“此语句将在anNum <2时执行”