KVC/KVO 进阶(三)KVC的验证和异常处理
来源:互联网 发布:索尼z3v电信4g网络 编辑:程序博客网 时间:2024/05/22 17:31
KVC的验证和异常处理
一般情况下,我们都可以正确的使用kvc,但遇到一些复杂的情况,我们无法分辨 key 或者 value 是否合法化
比如: 我们给persion 赋予一个height的属性。运行程序,最终crash ,如何规避掉这种crash。
//perion没有 height属性 [persion setValue:@181 forKeyPath:@"height"];
输出结果
2016-10-27 16:24:29.016 KVC[7307:304452] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<Persion 0x60800003f780> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key height.'
我们可以使用 - (BOOL)validateValue:(inout id _Nullable __autoreleasing )ioValue forKey:(NSString )inKey error:(out NSError * _Nullable __autoreleasing *)outError
Persion.m
@implementation Persion/** 在类的内部,进行检查,不符合要求 返回NO ,类外部可以使用 @param ioValue 比对赋值类型 @param inKey 比对属性 @param outError 报错信息 @return 先判断是否符合要求,再使用KVC */- (BOOL)validateValue:(inout id _Nullable __autoreleasing *)ioValue forKey:(NSString *)inKey error:(out NSError * _Nullable __autoreleasing *)outError { if ([*ioValue isKindOfClass:[NSString class]] && [inKey isEqualToString:@"name"]) { return YES; } return NO;}@end
ViewController.m
NSError *error; NSNumber *value = @200; if ([persion validateValue:&value forKey:@"name" error:&error]) { [persion setValue:value forKey:@"name"]; NSLog(@"可以赋值persion.name===%@",persion.name); }else { NSLog(@"不可以赋值value"); NSLog(@"%@",error.debugDescription); }
运行结果
2016-10-27 16:36:56.878 KVC[7541:315506] 不可以赋值value
这样就可以防止因为KVC的验证不到位,导致的程序crash。
KVC中keyPath的巧妙用法
情景:我们需要把一个数组里的People的名字的首字母大写,并且把新的名字存入新的数组, 这时候通常做法会是遍历整个数组,然后把每个People的name取出来,调用 capitalizedString 然后把新的String加入新的数组中。 有了KVC就有了新做法:
[array valueForKeyPath:@”name.capitalizedString”]
0 0
- KVC/KVO 进阶(三)KVC的验证和异常处理
- KVC/KVO 进阶(四)KVC是如何处理异常的
- KVC和KVO的学习
- KVC和KVO的理解
- oc的kvc和kvo
- KVO和KVC的理解
- KVO和KVC的区别
- KVC 和KVO的使用
- KVC和KVO的使用
- kvc和kvo的区别
- KVC/KVO 进阶(二)KVC方法执行顺序
- KVC与KVO的进阶使用
- KVC/KVO 进阶(一) 底层原理
- kvo 和kvc
- KVO和KVC
- KVC和KVO简介
- kvo和kvc
- Iphone 和 KVC/KVO
- CNN网络结构 - Refining Architectures of Deep Convolutional Neural Networks
- android achartengine使用
- JavaWeb -- 文件上传下载示例
- AndroidStudio报错 Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
- 第26课:Scala的核心力量和黄金定律
- KVC/KVO 进阶(三)KVC的验证和异常处理
- appStore 开发者账号申请 与区别
- udev----01
- ActiveMq 自学(四) 集成SpringMvc+Spring框架
- android6.0开发中遇到的权限坑
- 数据结构实验之二叉树四:还原二叉树
- binlog日志解析
- —五分钟理解一致性哈希算法(consistent hashing)
- unity性能优化