NSAssert 断言

NSAssert 是c语言的一个宏定义。 看一下具体定义:

#define NSAssert(condition, desc, ...)  \
    do {                \
    __PRAGMA_PUSH_NO_EXTRA_ARG_WARNINGS \
    if (__builtin_expect(!(condition), 0)) {        \
            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)
具体使用:

NSAssert(condition, desc);

当condition为空的时候,中断程序,打印后面的desc。
所以一般condition一般放的是一个对象或者 对象 != nil。后面的desc一般放字符串。
注意condition不支持逻辑或语法

//错误写法
NSAssert(a != nil || b != nil,  @"dddd");
NSAssert、assert和NSParameterAssert的区别:

assert 和 NSParameterAssert都只有一个参数,即condition,不会有后面的错误描述。

从 Xcode 4.2 开始,发布构建默认关闭了断言,它是通过定义 NS_BLOCK_ASSERTIONS 宏实现的。也就是说,当编译发布版时,任何调用 NSAssert 等的地方都被有效的移除了。

自定义NSAssertionHandler

NSAssertionHandler实例是当前线程自动创建的,用于处理错误断言。当使用NSAssert发生错误的时候的时候会向NSAssertionHandler发送错误的字符串。我们可以通过自定义NSAssertionHandler重写处理方法,从而避免程序崩溃。

@implementation CustomAssertHandler
//处理Objective-C的断言
- (void)handleFailureInMethod:(SEL)selector object:(id)object file:(NSString *)fileName lineNumber:(NSInteger)line description:(NSString *)format,... {
    NSLog(@"NSAssert Failure: Method %@ for object %@ in %@#%li", NSStringFromSelector(selector), object, fileName, (long)line);
}

同时需要在线程中将自定义的NSAssertionHandler替换。

//自己定义的NSAssertionHandler
    NSAssertionHandler *myHandler = [[CustomAssertHandler alloc] init];
    //给当前的线程
    [[[NSThread currentThread] threadDictionary] setValue:myHandler forKey:NSAssertionHandlerKey];

到这,当NSAssert检测当为空的对象时,就会调用handleFailureInMethod,此时程序不会崩溃。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • NSAssert与assert NSAssert和assert是断言,主要的差别是assert在断言失败的时候只是...
    GoCac阅读 307评论 0 1
  • NSAssert()是一个宏,用于开发阶段调试程序中的Bug,通过为NSAssert()传递条件表达式来断定是否属...
    啊啊啊啊锋阅读 975评论 0 0
  • NSAssert()只是一个宏,用于开发阶段调试程序中的Bug,通过为NSAssert()传递条件表达式来断定是否...
    Isy阅读 569评论 0 0
  • 今天运行代码遇到了NSAssert断言,这里做一个学习记录。 形式 官方文档链接 作用 在condition为fa...
    学生张奎阅读 257评论 0 0
  • 1
    如心1976阅读 161评论 1 0