iOS-KVC(一)基本使用
iOS-KVC(二)内部赋值深层次原理
iOS-KVC(三)内部取值深层次原理
iOS-KVC(四)常见异常处理
iOS-KVC(五)容器类
iOS-KVC(六)正确性验证
iOS-KVC(七)字典相关
iOS-KVC(八)常见使用
- 之前都是使用正确的key,如果使用错误的key呢?
- 设置值的时候,如果设置的是nil会发生什么情况,之前的文章已有提起。
KVC中最常见的异常情况
- 赋值/取值不小心使用了错误的Key;
- 在非指针对象赋值中不小心传递了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时,出现异常");
}
在执行就不会出现崩溃现象。
网友评论