Assertions and their Handling(断言处理)
视频锁定
{$ currentTime | date:'mm:ss' $}
{$ timeLeft | date:'mm:ss' $}
断言允许程序员在执行某些代码前,设置一些条件。在Objective-C中,是通过NSAssert宏的集合来进行断言设置的。如下:
NSAssert(<boolean test>, <formatString>, <argumentsToFormat>);
例如下面的具体断言:
NSAssert1(x == 10, "X should have been 10, but it was %d.", x);
如果执行到上面代码的时候,x的值不为10,那么系统会用NSLog()在控制台输出如下信息:
Foo.m:126 Assertion failed in Foo(instance), method Bar. X should have been 10, but it was 5
输出完这条信息后,系统会自动抛出一个异常,异常的类型是" NSInternalInconsistencyException"
。
为了提供方法和代码行号的信息,不同参数个数需要调用不同的NSAssert()宏,系统提供了5个断言宏,它们是:NSAssert(condition, description), NSAssert1(condition, format, arg1), NSAssert2(condition, format, arg1, arg2), ..., NSAssert5(...)。
如果你需要在标准的C函数中使用断言功能,你需要调用NSCAssert()来代替。
注意,你可以全部禁用断言的代码,如果需要这么做,你要将如下定义” #define NS_BLOCK_ASSERTIONS”放在” #include NSException.h”之前。
如果你想,你也可以通过重写的方式,改变当断言条件成立时向Console输出信息并抛出异常的这个处理方式。你需要创建一个类NSAssertionHandler的子类,并在你希望这么做的线程里创建该子类的对象去处理。如下:
[[[NSThread currentThread] threadDictionary]
setObject:myAssertionHandlerInstance forKey:N"SAssertionHandler"];
在线练习
{$ activeFileHint $}