美文网首页iOS
iOS-KVC(四)常见异常处理

iOS-KVC(四)常见异常处理

作者: 厦门_小灰灰 | 来源:发表于2019-06-23 18:05 被阅读0次

    iOS-KVC(一)基本使用
    iOS-KVC(二)内部赋值深层次原理
    iOS-KVC(三)内部取值深层次原理
    iOS-KVC(四)常见异常处理
    iOS-KVC(五)容器类
    iOS-KVC(六)正确性验证
    iOS-KVC(七)字典相关
    iOS-KVC(八)常见使用

    • 之前都是使用正确的key,如果使用错误的key呢?
    • 设置值的时候,如果设置的是nil会发生什么情况,之前的文章已有提起。

    KVC中最常见的异常情况

    1. 赋值/取值不小心使用了错误的Key;
    2. 在非指针对象赋值中不小心传递了nil的值;
    1.使用错误的key
    #import "ViewController.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        [self setValue:@"hui" forKey:@"abc"];  //赋值异常
    
        [self valueForKey:@"abc"];  //取值异常
    }
    
    
    @end
    
    
    结论:直接崩溃,抛出异常
    //赋值异常
    Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<ViewController 0x7fc55dc0cbe0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key abc.'
    
    //取值异常
    Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<ViewController 0x7fc0ecd09ac0> valueForUndefinedKey:]: this class is not key value coding-compliant for the key abc.'
    

    赋值找不到key的崩溃,如何处理这个异常?
    其实可以重写下面方法。

    - (void)setValue:(id)value forUndefinedKey:(NSString *)key
    {
        NSLog(@"key没有定义的时候,可以在这里处理");
    }
    

    取值找不到key的崩溃,如何处理这个异常?

    
    - (id)valueForUndefinedKey:(NSString *)key
    {
        NSLog(@"这是未找到定义的key");
        return nil;  //注意如果是某个非对象的属性赋值为 nil 时,抛出 NSInvalidArgumentException 的异常并崩溃,重写下面的方法- (void)setNilValueForKey:(NSString *)key;处理
    }
    
    2.在非指针对象赋值中不小心传递了nil的值

    注:如果是对象赋值为nil是不会出现崩溃现象;

    #import "ViewController.h"
    
    @interface ViewController ()
    
    @property (nonatomic, copy) NSString *name;
    @property (nonatomic, assign) NSUInteger age;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        [self setValue:nil forKey:@"name"];  //这行是不会出错的
        [self setValue:nil forKey:@"age"];  //这行会出错
    }
    
    
    @end
    
    结果:
    Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '[<ViewController 0x7ffb70604ae0> setNilValueForKey]: could not set nil as the value for the key age.'
    
    • 因为name属性是对象,所以赋值为nil不会崩溃,对象类型可以为nil;
    • 而age是整数,整数的类型不会是nil,这么强行赋值就会抛出异常出现错误。
      如果你不小心传了nil,KVC会调用setNilValueForKey:方法。这个方法默认是抛出异常。

    我们可以选择重写这个方法:

    - (void)setNilValueForKey:(NSString *)key
    {
        NSLog(@"这里处理当赋值为nil时,出现异常");
    }
    

    在执行就不会出现崩溃现象。

    相关文章

      网友评论

        本文标题:iOS-KVC(四)常见异常处理

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