实际上NSAssert有什么意义呢?

我必须问这个,因为:我唯一承认的是,如果断言失败,应用程序崩溃。 这是使用NSAssert的原因吗? 或者还有什么好处呢? 把NSAssert放在代码中的任何假设上面是正确的,就像一个函数不应该接收-1作为参数,但可能是-0.9或-1.1?

断言是确保价值是它应该是。 如果一个断言失败,意味着出了问题,所以应用程序退出。 使用断言的一个原因是如果你有一些不会performance的函数,或者如果传递给它的参数中的一个参数不是某个值(或者一个值的范围),那么你可以放置一个断言确定这个价值就是你期望的价值,如果不是那么真的是错误的,那么这个应用就会退出。 断言可以非常有用的debugging/unit testing,并且当你提供框架来阻止用户做“邪恶”的事情。

我真的不能和NSAssert交谈,但是我认为它和C的assert()类似。

assert()用于在您的代码中执行语义合约。 这是什么意思,你问?

好吧,就像你说的:如果你有一个永远不会收到-1的函数,你可以使assert()强制执行:

 void gimme_positive_ints(int i){
  断言(i> 0);
 }

现在,您将在错误日志(或STDERR)中看到类似下面的内容:

断言i> 0失败:文件example.c,第2行

所以它不仅安全 – 防止潜在的不良投入,而且以有用的标准方式logging它们。

哦,至less在C assert()是一个macros,所以你可以重新定义assert()作为你的释放代码没有操作。 我不知道NSAssert(甚至是assert())是否如此),但编译这些检查非常有用。

除了上面所说的每个人之外, NSAssert()的默认行为(不同于C的assert() )是抛出一个exception,你可以捕获和处理exception。 例如,Xcode这样做。

NSAssert给你的不仅仅是崩溃的应用程序。 它告诉你断言发生的类,方法和行。 所有的断言也可以很容易地使用NS_BLOCK_ASSERTIONS去激活。 从而使它更适合于debugging。 另一方面,抛出一个NSException只会使应用程序崩溃。 它也没有告诉exception的位置,也不能简单地禁用它。 看到下面的图像中的差异。

该应用程序崩溃,因为断言也引发了一个exception,正如NSAssert文档所述:

调用时,断言处理程序将打印包含方法和类名称(或函数名称)的错误消息。 然后引发一个NSInternalInconsistencyExceptionexception。

NSAssert:

记录在断言之后

NSException:

记录异常之后

只是为了澄清,正如有人提到,但没有完全解释,拥有和使用断言的原因,而不是仅仅创build自定义的代码(例如,如果和坏的数据引发exception)是断言应该禁用生产应用程序。

在开发和debugging的过程中,断言可以让你捕捉错误。 当断言评估为false时,程序将停止。 但是,编译生产时,编译器省略了断言代码,实际上使您的程序运行得更快。 届时,希望你已经修复了所有的错误。 如果你的程序在生产过程中仍然存在缺陷(当断言被禁止,程序“跳过”断言),你的程序可能最终崩溃在其他点。

从NSAssert的帮助:“如果定义预处理器macrosNS_BLOCK_ASSERTIONS断言被禁用。 所以,只把macros放在你的分配目标[只]。

NSAssert (及其stdlib等效assert )将在开发过程中检测编程错误。 你永远不应该有一个在生产(发布)应用程序失败的断言。 所以你可能会断言你从来没有把负数传递给需要积极论证的方法。 如果断言在testing过程中失败了,那么你有一个错误。 但是,如果用户input的值是用户input的,则需要对input进行适当的validation,而不是依赖生产中的断言(可以为发布版本设置#define,禁用NSAssert*

断言通常用于强制执行特定方法或逻辑的预期用途。 假设您正在编写一个计算两个大于零整数的和的方法。 为了确保方法总是按照预期使用,你可能会放置一个testing条件的断言。

简短的回答:他们强制您的代码只能按照预期使用。

值得指出的是,除了运行时检查之外,断言编程是在按合同devise代码时使用的重要工具。

有关合同声明和devise主题的更多信息可以在下面find:

声明(软件开发)

按合同devise

用断言编程

按合同devise,以实例为例[平装]

为了充分回答他的问题,任何types的断言都是为了帮助debugging。 从源头上捕获错误,然后在debugging器中导致崩溃时捕获它们更有价值。

例如,你可以传递一个值给一个函数,它需要一定范围内的值。 该函数可能会存储该值供以后使用,并在以后使用应用程序崩溃。 在这种情况下看到的调用堆栈不会显示错误值的来源。 抓住这个坏的价值是为了找出谁通过这个坏的价值以及为什么。

当它与条件匹配时, NSAssert使应用程序崩溃。 如果与条件不匹配,则执行下一条语句。 找下面的EX:

我只是创build一个应用程序来testing什么是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"); } 

进入我的代码应用程序不会崩溃。而testing案例是:

  • anNum > = 2 – >应用程序不会崩溃,您可以看到日志string:“当anNum <2”进入outPut日志控制台窗口时,将执行此语句
  • anNum <2 – >应用程序将崩溃,您不能看到日志string:“此语句将执行时,anNum <2”