自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

iPhone程序開發(fā) KVO/KVC實(shí)現(xiàn)機(jī)理分析

移動(dòng)開發(fā) iOS
本文介紹的是iPhone程序開發(fā) KVO/KVC實(shí)現(xiàn)機(jī)理分析,很詳細(xì)為友們介紹了他們的機(jī)制原理,我們來看內(nèi)容。

iPhone程序開發(fā) KVO/KVC實(shí)現(xiàn)機(jī)理分析是本文要介紹的內(nèi)容,不多說,直接進(jìn)入話題。我們來看詳細(xì)內(nèi)容。

Objective-C里面的Key-Value Observing (KVO)機(jī)制,非常不錯(cuò),可以很好的減少澆水代碼。關(guān)于KVO的學(xué)習(xí),可以參考文章:《Key-Value Observing快速入門》:http://www.cocoadev.cn/Objective-C/Key-Value-Observing-Quick-Start-cn.asp

Key-Value Coding(KVC)實(shí)現(xiàn)分析

KVC運(yùn)用了一個(gè)isa-swizzling技術(shù)。isa-swizzling就是類型混合指針機(jī)制。KVC主要通過isa-swizzling,來實(shí)現(xiàn)其內(nèi)部查找定位的。isa指針,如其名稱所指,(就是is a kind of的意思),指向維護(hù)分發(fā)表的對象的類。該分發(fā)表實(shí)際上包含了指向?qū)崿F(xiàn)類中的方法的指針,和其它數(shù)據(jù)。

比如說如下的一行KVC的代碼:

  1. [site setValue:@"sitename" forKey:@"name"]; 

就會(huì)被編譯器處理成:

  1. SEL sel = sel_get_uid ("setValue:forKey:");  
  2. IMP method = objc_msg_lookup (site->isa,sel);  
  3. method(site, sel, @"sitename", @"name"); 

首先介紹兩個(gè)基本概念:

(1)SEL數(shù)據(jù)類型:它是編譯器運(yùn)行Objective-C里的方法的環(huán)境參數(shù)。

(2)IMP數(shù)據(jù)類型:他其實(shí)就是一個(gè) 編譯器內(nèi)部實(shí)現(xiàn)時(shí)候的函數(shù)指針。當(dāng)Objective-C編譯器去處理實(shí)現(xiàn)一個(gè)方法的時(shí)候,就會(huì)指向一個(gè)IMP對象,這個(gè)對象是C語言表述的類型(事實(shí)上,在Objective-C的編譯器處理的時(shí)候,基本上都是C語言的)。

關(guān)于如何找到實(shí)現(xiàn)函數(shù)的指針,可參考文章:《Objective-C如何避免動(dòng)態(tài)綁定,而獲得方法地址》:http://www.cocoadev.cn/Objective-C/Get-method-address.asp

這下KVC內(nèi)部的實(shí)現(xiàn)就很清楚的清楚了:一個(gè)對象在調(diào)用setValue的時(shí)候,(1)首先根據(jù)方法名找到運(yùn)行方法的時(shí)候所需要的環(huán)境參數(shù)。(2)他會(huì)從自己isa指針結(jié)合環(huán)境參數(shù),找到具體的方法實(shí)現(xiàn)的接口。(3)再直接查找得來的具體的方法實(shí)現(xiàn)。

Key-Value Observing(KVO)實(shí)現(xiàn)

在上面所介紹的KVC機(jī)制上加上KVO的自動(dòng)觀察消息通知機(jī)制就水到渠成了。

當(dāng)觀察者為一個(gè)對象的屬性進(jìn)行了注冊,被觀察對象的isa指針被修改的時(shí)候,isa指針就會(huì)指向一個(gè)中間類,而不是真實(shí)的類。所以isa指針其實(shí)不需要指向?qū)嵗龑ο笳鎸?shí)的類。所以我們的程序***不要依賴于isa指針。在調(diào)用類的方法的時(shí)候,***要明確對象實(shí)例的類名。

熟悉KVO的朋友都知道,只有當(dāng)我們調(diào)用KVC去訪問key值的時(shí)候KVO才會(huì)起作用。所以肯定確定的是,KVO是基于KVC實(shí)現(xiàn)的。其實(shí)看了上面我們的分析以后,關(guān)系KVO的架構(gòu)的構(gòu)思也就水到渠成了。

因?yàn)?strong>KVC的實(shí)現(xiàn)機(jī)制,可以很容易看到某個(gè)KVC操作的Key,而后也很容易的跟觀察者注冊表中的Key進(jìn)行匹對。假如訪問的Key是被觀察的Key,那么我們在內(nèi)部就可以很容易的到觀察者注冊表中去找到觀察者對象,而后給他發(fā)送消息。

小結(jié):iPhone程序開發(fā) KVO/KVC實(shí)現(xiàn)機(jī)理分析的內(nèi)容介紹完了,希望本文對你有所幫助。

責(zé)任編輯:zhaolei 來源: 蘋果開發(fā)中文網(wǎng)
相關(guān)推薦

2014-04-23 14:40:06

iOS開發(fā)KVO內(nèi)部實(shí)現(xiàn)

2011-08-19 10:13:05

iPhone開發(fā)

2011-08-16 15:48:37

iPhone開發(fā)抓圖程序

2011-08-05 13:49:53

iPhone 應(yīng)用 開發(fā)

2011-08-17 16:12:20

iPhone應(yīng)用程序

2011-07-26 11:13:15

iPhone PXL

2011-07-25 17:13:31

iPhone 圖形 動(dòng)畫

2011-07-26 09:41:23

iPhone xcode Mac OS X

2012-04-26 13:36:30

iPhone運(yùn)行程序

2010-08-27 10:41:41

iPhone核心應(yīng)用程序

2011-07-08 15:08:16

iPhone 圖片

2011-07-26 14:18:20

2011-08-15 15:44:46

iPhone開發(fā)PDF

2011-08-18 16:24:44

iPhone開發(fā)圖片

2011-07-27 11:19:33

iPhone UITableVie

2011-07-28 10:11:54

iPhone開發(fā) 備忘

2012-04-26 13:23:31

iPhone程序畫面控件調(diào)整

2011-08-12 14:54:45

iPhone委托

2011-07-21 15:56:32

iPhone 截屏

2022-10-18 16:14:28

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)