Key-Value Coding

19 篇文章 0 订阅

 1.简介

 KVC:Key-Value Coding,直译是:键值编码。简单来讲,就是给属性设置值的 比如说如下的第一行KVC的代码,其实和第二行的普通代码是等效的:

           UITableViewController *vc = [segue destinationViewController];
         kvc:   [vc setValue:self.textField.text  forKey:@"startTime"];
                   vc.startTime = self.textField.text;
 KVC的代码会编译成这样:
       SEL sel = sel_get_uid ("setValue:forKey:");
       IMP method = objc_msg_lookup (myClass->isa,sel);
       method(site, sel, self.textField.text, @"startTime");

KVC内部的实现实际上是这样的:一个对象在调用setValue的时候:
a.  首先根据方法名找到运行方法的时候所需要的环境参数。
b.  它会从自己isa指针结合环境参数,找到具体的方法实现的接口。
c.  再直接查找得来的具体的方法实现。

2.demo示例:

//  KVCTableViewCell.h
//  KVC
//
//  Created by tinghou on 16/5/30.
//
//

#import <UIKit/UIKit.h>

@interface KVCTableViewCell : UITableViewCell

- (id)initWithReuseIdentifier:(NSString*)identifier;

// Object to display.
@property (nonatomic, readwrite, strong) id object;

// Name of property of object to display
@property (nonatomic, readwrite, copy) NSString *property;
@end

//
//  KVCTableViewCell.m
//  KVC
//
//  Created by tinghou on 16/5/30.
//
#import "KVCTableViewCell.h"

@implementation KVCTableViewCell

- (BOOL)isReady {
  
  return (self.object && [self.property length] > 0);
}

- (void)update {
  NSString *text;
  if (self.isReady) {
    
    id value = [self.object valueForKeyPath:self.property];
    text = [value description];
  }
  else {
    text = @"";
  }
  self.textLabel.text = text;
}

- (id)initWithReuseIdentifier:(NSString *)identifier {
  return [self initWithStyle:UITableViewCellStyleDefault
             reuseIdentifier:identifier];
}

- (void)setObject:(id)anObject {
  _object = anObject;
  [self update];
}

- (void)setProperty:(NSString *)aProperty {
  _property = aProperty;
  [self update];
}
@end

//
//  KVCTableViewController.m
//  KVC
//
//  Created by tinghou on 16/5/30.
//
                          
#import "KVCTableViewController.h"
#import "KVCTableViewCell.h"

@implementation KVCTableViewController

- (NSInteger)tableView:(UITableView *)tableView
 numberOfRowsInSection:(NSInteger)section {
  return 100;
}

- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  
  static NSString *CellIdentifier = @"KVCTableViewCell";
  
  KVCTableViewCell *cell = [tableView
             dequeueReusableCellWithIdentifier:CellIdentifier];
  
  if (cell == nil) {
    cell = [[KVCTableViewCell alloc]
            initWithReuseIdentifier:CellIdentifier];
   
    cell.property = @"intValue";
  }
  
  
  cell.object = @(indexPath.row);
  
  return cell;
}

@end


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值