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

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: '[ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key abc.'

//取值异常
Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[ 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: '[ 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(四)常见异常处理)