实际上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”
- “UIViewController子类”不出现在xcode 4.3的文件模板库中
- Swift中的NSObject子类:hash vs hashValue,isEqual vs ==
- 有没有办法从Cocoa WebView对象使用WebKit Web检查器?
- @selector中的参数
- 在本地iPhone应用程序中重复背景图像
- UILabel UITextField UITextView
- 从float或double实例化NSDecimalNumber的正确方法
- 我怎样才能改变模式UIViewController的animation风格?
- Xcode&Swift – 没有标题栏的窗口,但closures,最小化和调整button大小