1.什么是断言?
- 断言本质只是一个宏NSAssert(condition, desc),当表达式(condition)为真时,程序继续运行,如果表达式为假,那程序就会停止运行,并提示错误信息(desc)
2.应用场景:
- 用于开发阶段调试程序中的Bug,通过为NSAssert()传递条件表达式来断定是否属于Bug,满足条件返回真值,程序继续运行,如果返回假值,则抛异常,并切可以自定义异常描述。NSAssert()是这样定义的:
#define NSAssert(condition, desc)
3.什么是抛异常?
- 自定义描述异常信息的
desc
就是所谓的抛异常 - 注意:assert是一个宏,只在debug版本中起作用,在release版本中,该语句是不起任何作用的。
示例一:给图片属性赋值不能为空,添加断言,如果为空,则直接crash,抛异常
@interface ViewController ()
@property (nonatomic,weak) UIImage *icon;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIImageView *imageView = [[UIImageView alloc] init];
imageView.frame = CGRectMake(100, 100, 200, 200);
[self.view addSubview:imageView];
self.icon = [UIImage imageNamed:@""];
imageView.image = self.icon;
}
- (void)setIcon:(UIImage *)icon
{
NSAssert(icon != nil , @"图片不能为空" );
_icon = icon;
}
报错示例图:
示例二:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
BOOL isOn = NO;
NSAssert(isOn, @"如果表达式是假,直接报错");
}
示例图:
利用宏自定义断言
#define DXAssertNil(a,b,...) NSAssert((a)==nil,(b))
#define DXAssertNotNil(a,b,...) NSAssert((a)!=nil,(b))
#define DXAssertTrue(a,b,...) NSAssert((a),(b))
#define DXAssertEquals(a,b,c,...) NSAssert((a==b),(c))
#define DXAssertNotEquals(a,b,c,...) NSAssert((a!=b),(c))