1. KVC的实现原理

  • 遍历字典里面所有的key,以name为例
  • 去模型中查找有没有setName:方法,有就直接调用赋值

  • 假如没有找到setName:方法,就会继续查找有没有_name属性,有就_name = value赋值

  • 假如没有找到_name,还会继续查找模型中有没有name属性

  • 最终没有找到,就会直接报错

  报错信息:

2. KVC原理的使用

 KVC主要用于model的赋值,model最好定义我们想要的属性,但是有时会和我们得到的数据有一些不同,以下是几种常见情况:

  • 当我们取到的数据多于model的属性时,根据KVC原理就会出现上述的错误,解决办法:在model的.m文件中重写setValue:forUndefinedKey:方法
#import "ZFFlag.h"

@implementation ZFFlag

- (void)setValue:(id)value forUndefinedKey:(NSString *)key
{ } @end
  • 当我们需要的属性的类型和得到的数据的类型不同,解决办法:重写属性的setter方法(根据KVC的查找顺序可知)

  假如在视图中需要一张图片,但是得到的数据中一般是图片名,也就是一个 NSString * 类型的数据,具体解决办法请看代码

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h> @interface ZFFlag : NSObject @property (nonatomic, strong) NSString *name; @property (nonatomic, strong) UIImage *icon; // 重写icon的setter方法,注意类型为得到的数据中该属性的类型
- (void)setIcon:(NSString *)icon
{
_icon = [UIImage imageNamed:icon];
} // 防崩
- (void)setValue:(id)value forUndefinedKey:(NSString *)key
{ } @end
#import "ZFFlagView.h"

#import "ZFFlag.h"

@interface ZFFlagView ()

@property (weak, nonatomic) IBOutlet UILabel *label;
@property (weak, nonatomic) IBOutlet UIImageView *imageView; @end @implementation ZFFlagView - (void)setFlag:(ZFFlag *)flag
{
_flag = flag; // 给子控件赋值
_label.text = flag.name;
_imageView.image = flag.icon;
} @end

【原】iOS学习之KVC原理的更多相关文章

  1. 【原】iOS学习之事件处理的原理

    在iOS学习23之事件处理中,小编详细的介绍了事件处理,在这里小编叙述一下它的相关原理 1.UITouch对象 在触摸事件的处理方法中都会有一个存放着UITouch对象的集合,这个参数有什么用呢? ( ...

  2. 原 iOS深入学习(Block全面分析)http://my.oschina.net/leejan97/blog/268536

    原 iOS深入学习(Block全面分析) 发表于1年前(2014-05-24 16:45)   阅读(26949) | 评论(14) 39人收藏此文章, 我要收藏 赞21 12月12日北京OSC源创会 ...

  3. 【原】iOS学习47之第三方-FMDB

    将 CocoaPods 安装后,按照 CocoaPods 的使用说明就可以将 FMDB 第三方集成到工程中,具体请看博客iOS学习46之第三方CocoaPods的安装和使用(通用方法) 1. FMDB ...

  4. 【原】iOS学习之第三方-AFNetworking1.3.0

    将 CocoaPods 安装后,按照 CocoaPods 的使用说明就可以将 AFNetworking 第三方集成到工程中,具体请看上篇博客iOS学习46之第三方CocoaPods的安装和使用(通用方 ...

  5. 【原】iOS学习之SQLite和CoreData数据库的比较

    1. SQLite数据库 sqlite数据库操作的基本流程是, 创建数据库, 再通过定义一些字段来定义表格结构, 可以利用sql语句向表格中插入记录, 删除记录, 修改记录, 表格之间也可以建立联系. ...

  6. iOS学习路线图

    一.iOS学习路线图   二.iOS学习路线图--视频篇       阶 段 学完后目标 知识点 配套学习资源(笔记+源码+PPT) 密码 基础阶段 学习周期:24天       学习后目标:    ...

  7. 【如何快速的开发一个完整的iOS直播app】(原理篇)

    原文转自:袁峥Seemygo    感谢分享.自我学习 目录 [如何快速的开发一个完整的iOS直播app](原理篇) [如何快速的开发一个完整的iOS直播app](播放篇) [如何快速的开发一个完整的 ...

  8. 2015最新iOS学习线路图

    iOS是由苹果公司开发的移动操作系统,以xcode为主要开发工具,具有简单易用的界面.令人惊叹的功能,以及超强的稳定性,已经成为iPhone.iPad 和iPod touch 的强大基础:iOS 内置 ...

  9. ios 学习路线总结

    学习方法 面对有难度的功能,不要忙着拒绝,而是挑战一下,学习更多知识. 尽量独立解决问题,而不是在遇到问题的第一想法是找人. 多学习别人开源的第三方库,能够开源的库一定有值得学习的地方,多去看别的大神 ...

随机推荐

  1. C/C++中调用python文件

    1.将python27安装目录下include.libs文件夹拷贝至Demo程序目录. 2.Demo项目设置包含Python.h.python27.lib); (因为安装python27的时候,pyt ...

  2. JavaScript基础——使用JavaScript对象

    JavaScript有许多内置对象,如Number(数字).Array(数组).String(字符串).Date(日期)和Math(数学).这些内置对象都有成员属性和方法.除了JavaScript对象 ...

  3. sqlserver 连接远程数据库小结

    A,B两个数据库,不在同一台服务器实例 当需要通过sqlserver语句来实现对远程数据库操作(OPENDATASOURCE): select * from -- 操作类型 OPENDATASOURC ...

  4. 服务器知识----IIS架设问题

    1,基本配置,应用程序池,路径等. 2,权限设置  Iuser  IIS_users 只读权限 3,isapi映射  framework安装目录下  运行 aspnet_regiis.exe -i 注 ...

  5. PHP求时间间隔 n天、周、月、年后的时间

    <?php date_default_timezone_set('PRC'); // 设置时区 $date1 = strtotime('2015-01-01'); //把日期转换成时间戳 $da ...

  6. 【叉积】【sdut 2508 图形密码】

    图形密码 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 题目链接:http://acm.sdut.edu.cn/sdutoj/p ...

  7. 简简单单的一个PYTHON多进程实现

    因为在作自动化部署时,希望能将多个服务分不同的批次进行发布, 同一批次的机器同时发布, 如果前面一批次出错误,后面就需要停止整 个流程. 那可以简单的用threading来实现了. thread_li ...

  8. memcached基于socket访问memcache缓存服务器

    memcached基于socket访问memcache缓存服务器 操作memcache常用三种方法: .memcache基于php_memcache.dll扩展(php扩展) .memcached基于 ...

  9. PMP 第七章 项目成本管理

    估算成本 制定预算 控制成本 1.成本管理计划的内容和目的是什么?     包括对成本进行估算 预算和控制的各过程,从而确保项目在批准的预算内完工. 2.直接成本.间接成本.可变成本.固定成本.质量成 ...

  10. hibernate base

    第一个类:Person.java package org.crazyit.app.domain; import java.io.Serializable;import java.util.ArrayL ...