on 2012 年 6 月 7 日, in iphone, by donly
kvc 與 kvo 是 objective c 的關鍵概念,個人認為必須理解的東西,下面是例項講解。
乙個物件擁有某些屬性。比如說,乙個 person 物件有乙個 name 和乙個 address 屬性。以 kvc 說法,person 物件分別有乙個 value 對應他的 name 和 address 的 key。 key 只是乙個字串,它對應的值可以是任意型別的物件。從最基礎的層次上看,kvc 有兩個方法:乙個是設定 key 的值,另乙個是獲取 key 的值。如下面的例子:
?
1
2
3
4
5
6
7
8
9
10
11
12
void
changename(person *p, nsstring *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)
key 與 key pat 要區分開來,key 可以從乙個物件中獲取值,而 key path 可以將多個 key 用點號 「.」 分割連線起來,比如:
[p valueforkeypath:@
"spouse.name"
];
相當於這樣……
[[p valueforkey:@
"spouse"
] valueforkey:@
"name"
];
好了,以上是 kvc 的基本知識,接著看看 kvo。
key-value observing (kvo) 建立在 kvc 之上,它能夠觀察乙個物件的 kvc key path 值的變化。舉個例子,用**觀察乙個 person 物件的 address 變化,以下是實現的三個方法:
?
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
// whenever an observed key path changes, this method will be called
- (
void
)observevalueforkeypath:(nsstring *)keypath
ofobject:(id)object
change:(nsdictionary *)change
context:(
void
*)context
}
-(
void
) dealloc;
[m_observedpeople release];
m_observedpeople = nil;
[super dealloc];
}
-(id) init;
return
self;
}
@end
這就是 kvo 的作用,它通過 key path 觀察物件的值,當值發生變化的時候會收到通知。
[super dealloc ];之所以會放在後面是因為很多變數是從父類繼承過來的,所以要放在變數釋放的後面。
kvc程式設計時setvalue(value: anyobject?, key: string)和setvalue(value: anyobject?, keypath: string)
key:只能接受當前類所具有的屬性,不能是自己的,還是從父類繼承過來的,如view.setvalue(cgrectzero(), key: "frame");
keypath: 出了能接受當前類的屬性,還能接受當前類屬性的屬性,即可以接受關係鏈,如view.setvalue(5, keypath: "layer.cornerradius")
KVC和KVO底層原理
kvc和kvo想必都熟知的乙個名詞,觀察者模式,而kvo是基於kvc的,那麼kvc到底是個什麼,kvo又是什麼,那麼它們之間是怎麼關聯的。當你了解kvc機制,會恍然大悟,只要知道乙個ui的結構,就能對他做任意的修改。而kvo是觀察者模式的一種實現,對物件屬性監聽能達到乙個高效能處理,所以了解kvc和...
KVO和KVC的對比理解
kvc 與 kvo 是 objective c 的關鍵概念,個人認為必須理解的東西,下面是例項講解。乙個物件擁有某些屬性。比如說,乙個 person 物件有乙個 name 和乙個 address 屬性。以 kvc 說法,person 物件分別有乙個 value 對應他的 name 和 address...
OC中的KVC和KVO(一)
設計模式 觀察者模式 設計模式是用來解決某一特定問題 1.什麼是觀察者模式?在工程中,一些類去觀察 a 類,當 a 類發生改變時,這些類就收到訊息,做出相應反應。2.什麼時候使用觀察者模式 當乙個類需要傳送訊息給多個類時,就使用觀察者模式 3.觀察者模式的作用 一對多的訊息傳送 4.oc中觀察者模式...