美文网首页
iOS-NSAssert/NSException的使用

iOS-NSAssert/NSException的使用

作者: 洧中苇 | 来源:发表于2016-12-18 13:11 被阅读0次

    NSAssert:又称为断言,它是一个宏,通过判断条件表达式NSAssert(),判定是否属于BUG,从而提醒开发者代码中出现的不合理情况,同时可以自定义错误信息.
    条件表达式如下,condition为判断条件,当其中的条件不满足时才抛出错误,(也就是condition返回NO的情况),desc就是错误信息,可以自己定义

    NSAssert(condition, desc)
    

    在写无限轮播的代码中,我有一个判断图片轮播的时间间隔是否合理,如果时间间隔<0.01s就判定为不合理,抛出异常,代码如下

    if (timer <= 0.01) {
            NSAssert(timer < 0.01, @"定时器时间间隔过短");
            return NO;
        }
    

    控制台打印如下,除了错误信息,还打印了错误的文件名和行号YPCycleView.m:164

    /Users/peiyang/Desktop/PictureScroll/12-17-无限轮播/12-17-无限轮播/YPCycleView.m:164
    2016-12-18 11:56:21.429 12-17-无限轮播[19020:653771] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '定时器时间间隔过短'
    

    通过源码我们能很快定义到对应的关键字__FILE____LINE__,前者是打印文件名,后者是打印对应的行号.
    接下来我们来看看它在系统中的定义,在代码中有一个NSAssertionHandler类,用来处理断言的失败情况,失败情况出现时会传递一个字符串给NSAssertionHandler对象来描述失败的原因。每个线程都有自己的NSAssertionHandler对象。当调用时,一个断言处理器会打印包含方法和类(或函数)的错误消息,并引发一个NSInternalInconsistencyException异常。

    #if !defined(_NSAssertBody)
    #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
    

    在DEBUG模式下才会打印NSASSert的情况,在Release模式下是不会打印错误信息的.

    NSException:

     NSException *excp = [NSException exceptionWithName:@"FileError" reason:@"笨蛋,文件不存在或者不是文件夹,请好好检查" userInfo:nil];
            [excp raise];
    

    相关文章

      网友评论

          本文标题:iOS-NSAssert/NSException的使用

          本文链接:https://www.haomeiwen.com/subject/djgamttx.html