什么是assert
assert是断言、简单来讲、就是代码的作者认定这个条件一定要是能满足断言的条件、否则代码不满足最基本的条件也就不用再运行下去、防止错误的代码引起更深层的问题。
if (条件成立){
}
else {
中断程序
}
NSAssert的定义如下
#define NSAssert(condition, desc, ...) \
do { \
__PRAGMA_PUSH_NO_EXTRA_ARG_WARNINGS \
if (!(condition)) { \
NSString *__assert_file__ = [NSString stringWithUTF8String:__FILE__]; \
__assert_file__ = __assert_file__ ? __assert_file__ : @"<Unknown File>"; \
[[NSAssertionHandler currentHandler] handleFailureInMethod:_cmd \
object:self file:__assert_file__ \
lineNumber:__LINE__ description:(desc), ##__VA_ARGS__]; \
} \
__PRAGMA_POP_NO_EXTRA_ARG_WARNINGS \
} while(0)
#endif
我们来看下NSAssert的效果:
NSAssert(0, @”0”);
log如下:
* Assertion failure in -[HomeViewController viewDidLoad], /Documents/APP代码/Home/Controllers/TNHomeViewController.m:248
NSAssert不会像assert、直接中断程序、而是会停在的断点、然后仍然可以继续进行程序。
注意事项
- assert只会在debug模式下起作用、所以assert应该只用过错误处理、而不是异常处理。如果是防卫性编程、请使用异常处理
- assert 会占用较多的系统资源
- assert一次最好只关注一个条件、不要同时去判断多个条件、有利于捕捉错误。
ps:为什么宏的定义里面有do while(0),可以参考do while(0)的妙用