iOS-面试助攻(二)

详细理解KVC与KVO

在面试的时候,KVC与KVO有些时候还是会问到的,并且他们都是Objective C的关键概念黄色别墅,在这里我们先做一个简单地介绍:

(一)KVC:

KVC即指:NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间326电影网接访问对象的属性。KVO就是基于KVC实现的关键技术之一。

一个对象拥有某些属性;比如说,一个Person对象有一个name和一个address属性,以KVC说法,Person对象分别有一个value对应他的name和sex的key;这里key只是一个字符串,他对应的值可以使任意类型的对象;从性喜剧最基础的从此上看,KVC有两个方法:一个是设置key的值,另一个是获取key的值;(示例代码如下:)

1
2
3
4
5
6
7
8
9
10
11
12
void  changeName(Person *p, NSString *newName)
{
  
     // using the KVC accessor (getter) method
     NSString *originalName = [p valueForKey: @"name" ];
  
     // using the KVC  accessor (setter) method.
     [p setValue:newName forKey: @"name" ];
  
     NSLog( @"Changed %@'s name to: %@" , originalName, newName);
  
}

 现在,如果 Person 有另外一个 key 配偶(spouse),spouse 的 key 值是另一个 Person 对象,用 KVC 可以这样写(示例代码如下:)

1
2
3
4
5
6
7
8
9
10
11
12
13
void  logMarriage(Person *p)
{
  
     // just using the accessor again, same as example above
     NSString *personsName = [p valueForKey: @"name" ];
  
     // this line is different, because it is using
     // a "key path" instead of a normal "key"
     NSString *spousesName = [p valueForKeyPath: @"spouse.name" ];
  
     NSLog( @"%@ is happily married to %@" , personsName, spousesName);
  
}

 key 与 key pat 要区分开来,key 可以从一个对象中获取值,而 key path 可以将多个 key 用点号 “.” 分割连接起来,比如:

1
[p valueForKeyPath: @"spouse.name" ];

 相当于这样……

1
[[p valueForKey: @"spouse" ] valueForKey: @"name" ];

 (二)KVO:

KVO即指:Key-Value Observing建立在 KVC 之上,它能够观察一个对象的 KVC key path 值的变化。举个例子,用代码观察一个 person 对象的 address 变化,以下是实现的三个方法:

(1)watchPersonForChangeOfAddress: 实现观察;
(2)observeValueForKeyPath:ofObject:change:context: 在被观察的 key path 的值变化时调用;
(3)dealloc 停止观察。

(示例代码如下:)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
static  NSString * const  KVO_CONTEXT_ADDRESS_CHANGED =  @"KVO_CONTEXT_ADDRESS_CHANGED"
  
@implementation PersonWatcher
  
-( void ) watchPersonForChangeOfAddress:(Person *)p
{
  
     // this begins the observing
     [p addObserver:self
         forKeyPath: @"address"
            options:0
            context:KVO_CONTEXT_ADDRESS_CHANGED];
  
     // keep a record of all the people being observed,
     // because we need to stop observing them in dealloc
     [m_observedPeople addObject:p];
}
  
// whenever an observed key path changes, this method will be called
- ( void )observeValueForKeyPath:(NSString *)keyPath
                       ofObject:(id) object
                         change:(NSDictionary *)change
                        context:( void  *)context
  
{
     // use the context to make sure this is a change in the address,
     // because we may also be observing other things
     if (context == KVO_CONTEXT_ADDRESS_CHANGED) {
         NSString *name = [ object  valueForKey: @"name" ];
         NSString *address = [ object  valueForKey: @"address" ];
         NSLog( @"%@ has a new address: %@" , name, address);
     }
}
  
-( void ) dealloc;
{
  
     // must stop observing everything before this object is
     // deallocated, otherwise it will cause crashes
     for (Person *p  in  m_observedPeople){
         [p removeObserver:self forKeyPath: @"address" ];
     }
  
     [m_observedPeople release];
     m_observedPeople = nil;
  
     [super dealloc];
  
}
  
-(id) init;
{
     if (self = [super init]){
         m_observedPeople = [NSMutableArray  new ];
     }
  
     return  self;
}
  
@end

 这就是 KVO 的作用,它通过 key path 观察对象的值,当值326影视发生变化的时候会收到通知。

(以上便是KVO和KVC的相关理解,还希望大家相互补充共同进步)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值