天天看點

KVC & KVO

        KVC和KVO看上去又是兩個挺牛的單詞簡寫,KVC是Key-Value Coding的簡寫,是鍵值編碼的意思。KVO是Key-Value  Observing的簡寫,是鍵值觀察的意思。那麼我們能拿KVC和KVO幹些什麼事呢?這兩個縮寫單詞不能否認聽起來挺高端的樣子。這兩個方法都是runtime方法,我們先來介紹KVC。

        1.KVC(Key-Value Coding)鍵值編碼

            為了測試我們建立兩個測試類

                  測試類一:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

#import <Foundation/Foundation.h>

@

class

SubKVCClass;

@interface KVCClass : NSObject

@property(copy ,nonatomic) NSString *name;

@property(retain, nonatomic) SubKVCClass *subKVC;

@end

#import "KVCClass.h"

#import "SubKVCClass.h"

@implementation KVCClass

-(NSString *)description

{

NSString *str = [NSString stringWithFormat:@

"property = %@, subName = %@"

, _name, _subKVC.subName];

return

str;

}

@end

                測試類二:

#import <Foundation/Foundation.h>

@interface SubKVCClass : NSObject

@property (copy, nonatomic) NSString *subName;

@end

#import "SubKVCClass.h"

@implementation SubKVCClass

@end

            (1)我們可以用鍵值編碼給對象的屬性動态指派(必須得有标準的getter和setter方法,或者用@property聲明)

                我們可以調用setValue: forKey: 方法以字元串的相識向對象發送消息,可以設定執行個體變量的值。第一個參數是要設定的值,第二個參數是執行個體變量的名稱

                我們可以調用valueForKey: 來擷取執行個體變量的值,廢話少說,代碼走起:

KVCClass *kvc = [KVCClass 

new

];

//通過setValue: forKey:來動态設定屬性的值

[kvc setValue:@

"我是同過setValue方法設定的值"

forKey:@

"name"

];

//通過valueForkey來擷取值

NSLog(@

"name = %@"

, [kvc valueForKey:@

"name"

]);

            代碼運作結果:

2014-08-14 16:08:57.940 Memory[1414:303] name = 我是同過setValue方法設定的值

            (2)我們可以通過鍵路徑給執行個體變量是其他類的對象指派 setValue: forKeyPath:

                代碼如下: 接着上面的代碼來得,KVC的一項執行個體變量是SubKVCClass的對象

//通過鍵路徑來給KVCClass中的對象的屬性指派

SubKVCClass *sub = [SubKVCClass 

new

];

kvc.subKVC = sub;  

[kvc setValue:@

"我是subName, 通過kvc的鍵路徑來給我賦的值"

forKeyPath:@

"subKVC.subName"

];

NSLog(@

"subName = %@"

, [kvc valueForKeyPath:@

"subKVC.subName"

]);

NSLog(@

"%@"

, kvc);

            上面代碼的運作結果:

2014-08-14 16:08:57.941 Memory[1414:303] subName = 我是subName, 通過kvc的鍵路徑來給我賦的值

2014-08-14 16:08:57.942 Memory[1414:303] property = 我是同過setValue方法設定的值, subName = 我是subName, 通過kvc的鍵路徑來給我賦的值

        KVC的基本内容概就這些吧,當然啦還有在數組中使用KVC以及KVC中的運算-集合等,不做贅述啦。

    2.介紹完KVC那麼我們來介紹一下KVO,鍵值觀察

        鍵值觀察是個什麼東西啊?他有什麼用啊?怎麼用?從字面意思上說鍵值觀察就是觀察屬性值的變化,也是運作時的方法,當執行個體變量改變時,系統會自動采取一些動作。

        KVO使用三步走:

             (1)注冊成為觀察者

             (2)觀察者定義KVO的回調

             (3)移除觀察者

        來點實際的,還得上代碼:

        KVOClass接口:

#import <Foundation/Foundation.h>

@interface KVOClass : NSObject

@property(strong,nonatomic) NSString * name;

@end

       KVOClass實作

20

21

22

23

24

25

26

27

28

29

30

31

#import "KVOClass.h"

@implementation KVOClass

//在init注冊觀察者

-(id) init

{

if

(self = [super init]) {

[self addObserver:self

forKeyPath:@

"name"

options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld

context:@

"name"

];

}

return

self;

}

//重寫觀察方

- (

void

)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(

void

*)context

{

if

(context == @

"name"

) {

NSLog(@

"name被改變啦!"

);

else

{

[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];

}

}

//移除觀察者

-(

void

) dealloc

{

[self removeObserver:self forKeyPath:@

"name"

];

[super dealloc];

}

@end

    ​代碼說明:注冊觀察者的時候調用addObserver方法,第一個參數是觀察那個類,第二個參數是那個類中的那個屬性,第三個方法是觀察選項,第四個會傳到下面的觀察方法中

    ​  上面的代碼運作結果為:

2014-08-14 16:56:16.843 Memory[1483:303] name被改變啦!

作者:青玉伏案

出處:http://www.cnblogs.com/ludashi/

本文版權歸作者和共部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

如果文中有什麼錯誤,歡迎指出。以免更多的人被誤導。

收履歷:某網際網路公司,招聘iOS/Android靠譜工程師,入職後,可内部聯系樓主,有小禮品贈送,有意者可郵箱投遞履歷:[email protected]