OC中关于断言的问题

记录一下断言的学习情况。

Foundation框架中定义了两组断言相关的宏,分别是

<.1.>NSAssert / NSCAssert

<.2.>NSParameterAssert / NSCParameterAssert

这两组宏主要在语义和功能上有所差别,主要区别如下:

<.1.>如果我们需要确保方法或函数的输入参数的正确性,则应该在方法(函数体)内的顶部使用NSParameterAssert / NSCParameterAssert。其它情况下使用NSAssert / NSCAssert

<.2.>这两组断言介于C和OC之间也是有着不同的。NSAssert /NSParameterAssert 是用于OC的上下文的。NSCAssert / NSCParameterAssert是用于C的上下文的。

当断言失败的时候,一般会报出下面的错误:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid parameter not satisfying: index<10'

Foundation为了处理断言,专门定义了一个NSAssertionHandler来处理断言失败的情况。NSAssertionHandler对象是自动创建的,用于处理失败的断言。当断言失败的时候,会传递一个字符串给NSAssertionHandler对象来描述失败的原因。每个线程都有自己的NSAssertionHandler对象。当调用时,一个断言处理器会打印包含方法和类(或函数)的错误信息,并引发一个NSInternalInconsistencyException异常,就像上面所看到的那样。我们很少直接去调用NSAssertionHandler的断言处理方法,通常都是自动调用的。

NSAssertionHandler提供了下面的三个方法并且定义了一个常量字符串,如下所示。

先介绍这个常量字符串。

NSString * const NSAssertionHandlerKey;

主要是用于在线程的threadDictionary字典中获取或者设置断言处理器。

再来介绍下面的三种方法。

<.1.>

//返回当前线程的NSAssertionHandler对象,如果当前线程没有相关的断言处理器,则该方法会创建一个,并制定给当前线程。

+ (NSAssertionHandler *)currentHandler

<.2.>

//当NSCAssertNSCParameterAssert断言失败的时候,会调用这个方法

- (void)handleFailureInFunction:(NSString *)functionName file:(NSString *)object lineNumber:(NSInteger)fileName deion:(NSString *)line, format,...

<.3.>

//当NSAssertNSParameterAssert断言失败的时候,会调用这个方法

- (void)handleFailureInMethod:(SEL)selector object:(id)object file:(NSString *)fileName lineNumber:(NSInteger)line deion:(NSString *)format, ...

断言的简单的使用。
NSAssert(index<10, @"参数大于10");
NSParameterAssert(index<10);

最后再补充一点,在Xcode4.2以后,在release版本中断言是默认关闭的,这是由宏NS_BLOCK_ASSERTIONS来处理的。也就是说,在编译release版本中,所有的断言调用都是无效的。

转载于:https://my.oschina.net/Atoman/blog/688325

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值