美文网首页
iOS开发中的断言(NSAssert和NSParameterAs

iOS开发中的断言(NSAssert和NSParameterAs

作者: 153037c65b0c | 来源:发表于2018-06-01 14:26 被阅读74次

    断言是指在开发期间使用的、让程序在运行时进行自检的代码(通常是一个子程序或宏)。NSAssert和NSParameterAssert在开发环境中经常被使用,调试和验证代码参数的完整性,断言为真,则表明程序运行正常,断言为假,则意味着它已经在代码中发现了意料之外的错误。一般XCode中的断言在Debug模式默认是开启的,Realse版本中是禁用的。

    检查是否是debug模式开启断言,release模式关闭,Build Settings中的设置如下:

    断言的使用

    NSAssert的简单使用:

    测试代码 运行结果

    从运行结果可以发现程序奔溃,并打印出奔溃在第几行以及原因。

    NSParameterAssert(参数断言)的简单使用:

    测试代码 运行结果

    断言为假时自定义处理

    断言的原理:

    1.Objective-C 用一个面向对象的途径混合了 C 语言风格的断言宏定义来注入和处理断言失败。即:NSAssertionHandler:

    2.每个线程拥有它自己的断言处理器,它是 NSAssertionHandler 类的实例对象。当被调用时,一个断言处理器打印一条包含方法和类名(或者函数名)的错误信息。然后它抛出一个 NSInternalInconsistencyException异常。

    3.当 NSAssert 或 NSParameterAssert (OC的断言)的条件不满足时,断言处理器会调用 -handleFailureInMethod:object:file:lineNumber:description:方法。

    当 NSCAssert 或 NSCParameterAssert (C的断言)的条件不满足时,断言处理器会调用 -handleFailureInFunction:file:lineNumber:description:方法。

    自定义处理断言(OC)的步骤:

    1.自定义继承自NSAssertionHandler的类YYAssertionHandler,在YYAssertionHandler中重写 - (void)handleFailureInMethod:(SEL)selector object:(id)object file:(NSString *)fileName lineNumber:(NSInteger)line description:(NSString *)format, ...方法。

    若断言为假,在该方法中会返回:

    selector:发生错误的方法

     object:发生错误的类  

    fileName:发生错误类的文件路径  

    line: 发生错误所在行  

    format:错误原因

    在该方法中我们可以自己写当断言为假时需要做的操作(比如抛出异常)

    2.在AppDelegate的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中加入如下代码:

    YYAssertionHandler *handler = [[YYAssertionHandler alloc] init];

        [[[NSThread currentThread] threadDictionary] setValue:handler forKey:NSAssertionHandlerKey];

    加入之后表示在主线程的代码中的断言被自定义,若是把断言写在其他线程,为假时还是由系统处理

    相关文章

      网友评论

          本文标题:iOS开发中的断言(NSAssert和NSParameterAs

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