iOS開發(fā) 通知、kvc也搓、kvo赏廓、代理之間的區(qū)別與聯(lián)系并使用oc語言舉例說明

在iOS開發(fā)中,通知(Notification)傍妒、鍵值編碼(KVC)幔摸、鍵值觀察(KVO)和代理(Delegate)是四種常見的設(shè)計(jì)模式和通信機(jī)制。它們各自有獨(dú)特的特點(diǎn)和適用場景颤练,同時(shí)也有一定的聯(lián)系既忆。以下將從它們的區(qū)別與聯(lián)系出發(fā),并結(jié)合OC語言示例進(jìn)行說明嗦玖。

1. 通知(NSNotification)

特點(diǎn):

一對多通信:通知允許一個(gè)對象向多個(gè)接收者發(fā)送消息患雇,適用于解耦的場景。

全局通知:通過NSNotificationCenter管理宇挫,可以在整個(gè)應(yīng)用范圍內(nèi)發(fā)送和接收通知苛吱。

靈活性:可以攜帶自定義信息,但無法直接返回結(jié)果器瘪。

適用場景:

控制器之間傳遞事件信息翠储。

視圖模型層與控制器層之間的通信绘雁。

示例代碼:

// 發(fā)送通知

NSNotification *notification = [NSNotification notificationWithName:@"MyNotification" object:self];

[[NSNotificationCenter defaultCenter] postNotification:notification];

// 接收通知

[[NSNotificationCenter defaultCenter] addObserver:self

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? selector:@selector handleNotification:]

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? name:@"MyNotification"

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? queue:nil];

- (void)handleNotification:(NSNotification *)notification {

? ? NSLog(@"Received notification");

}

2. 鍵值編碼(KVC)

特點(diǎn):

間接訪問對象屬性:通過字符串鍵名訪問對象的屬性,無需調(diào)用getter或setter方法彰亥。

動(dòng)態(tài)性:支持動(dòng)態(tài)修改屬性值咧七,但編譯時(shí)無法檢查錯(cuò)誤。

效率較低:相比直接調(diào)用方法任斋,性能稍低继阻。

適用場景:

動(dòng)態(tài)屬性操作,如數(shù)據(jù)綁定废酷。

簡化代碼瘟檩,減少重復(fù)的getter/setter方法。

示例代碼:

// 設(shè)置屬性值

?self.myProperty = @"Hello"; // 直接調(diào)用

?[self setValue:@"Hello" forKey:@"myProperty"]; // KVC方式

// 獲取屬性值

NSString *value = self.myProperty; // 直接調(diào)用

NSString *kvcValue = [self valueForKey:@"myProperty"]; // KVC方式

3. 鍵值觀察(KVO)

特點(diǎn):

觀察者模式:允許對象監(jiān)聽其他對象的屬性變化澈蟆,并在變化時(shí)觸發(fā)回調(diào)墨辛。

動(dòng)態(tài)性:通過運(yùn)行時(shí)機(jī)制實(shí)現(xiàn),無需修改被觀察對象的代碼趴俘。

靈活性:支持單對多關(guān)系睹簇,但需要手動(dòng)注冊和注銷觀察者。

適用場景:

視圖模型層與控制器層之間的通信寥闪。

實(shí)現(xiàn)MVC或MVVM架構(gòu)中的數(shù)據(jù)綁定太惠。

示例代碼:

// 注冊觀察者

[self addObserver:self forKeyPath:@"myProperty"

?? ? ? ? ? changeHandler:^(id obj, NSKeyValueChange change, NSKeyValueChangeReason reason, NSKeyValueChangeContext *context) {

?? ? ? ? ? ? ? NSLog(@"Property changed");

?? ? ? ? ? }];

// 觀察屬性變化

- (void)observeValueForKeyPath:(NSString *)keyPath

?? ? ? ? ? ? ? ? ? ? ? ofObject:(id)object

?? ? ? ? ? ? ? ? ? ? ? ? change:(NSDictionary *)change

? ? ? ? ? ? ? ? ? ? context:(void *)context {

? ? NSLog(@"Received change for keyPath: %@", keyPath);

}

// 移除觀察者

[self removeObserver:self forKeyPath:@"myProperty"];

4. 代理(Delegate)

特點(diǎn):

一對一通信:通常用于兩個(gè)對象之間的協(xié)作,調(diào)用方通過協(xié)議定義方法疲憋,被調(diào)用方實(shí)現(xiàn)這些方法凿渊。

嚴(yán)格耦合:代理模式要求調(diào)用方和被調(diào)用方之間有明確的接口約定。

靈活性:可以返回值缚柳,便于控制流程埃脏。

適用場景:

視圖控制器與模型之間的交互。

實(shí)現(xiàn)復(fù)雜的業(yè)務(wù)邏輯秋忙。

示例代碼:

// 定義協(xié)議

@protocol MyDelegate <NSObject>

- (void)actionCompleted;

@end

// 實(shí)現(xiàn)協(xié)議

@interface MyViewController : UIViewController <MyDelegate>

@end

// 使用代理

- (void)doSomething {

? ? MyViewController *vc = [[MyViewController alloc] init];

? ? vc.delegate = self;

? ? [vc performTask];

}

- (void)actionCompleted {

? ? NSLog(@"Action completed");

}

區(qū)別與聯(lián)系

區(qū)別:

通知:一對多通信彩掐,全局通知,適用于解耦場景灰追。

KVC/KVO:鍵值操作佩谷,KVC用于動(dòng)態(tài)訪問屬性,KVO用于監(jiān)聽屬性變化监嗜。

代理:一對一通信谐檀,嚴(yán)格耦合,適用于協(xié)作場景裁奇。

聯(lián)系:

通知與KVO:都可以用于對象間的通信桐猬,但通知更適用于全局通信,而KVO更適合細(xì)粒度的屬性監(jiān)聽刽肠。

代理與KVO:代理模式可以替代KVO的部分功能溃肪,尤其是在需要返回值或控制流程的場景中免胃。

總結(jié)

在實(shí)際開發(fā)中,選擇合適的設(shè)計(jì)模式和通信機(jī)制需要根據(jù)具體需求來決定惫撰。例如羔沙,在需要解耦的場景中優(yōu)先考慮通知;在需要細(xì)粒度監(jiān)聽屬性變化時(shí)選擇KVO厨钻;在需要嚴(yán)格控制流程時(shí)使用代理扼雏。通過合理結(jié)合這些模式,可以提高代碼的可讀性和可維護(hù)性夯膀。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诗充,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子诱建,更是在濱河造成了極大的恐慌蝴蜓,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俺猿,死亡現(xiàn)場離奇詭異茎匠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)押袍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進(jìn)店門汽抚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人伯病,你說我怎么就攤上這事》窆” “怎么了午笛?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長苗桂。 經(jīng)常有香客問我药磺,道長,這世上最難降的妖魔是什么煤伟? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任癌佩,我火速辦了婚禮,結(jié)果婚禮上便锨,老公的妹妹穿的比我還像新娘围辙。我一直安慰自己,他們只是感情好放案,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布姚建。 她就那樣靜靜地躺著,像睡著了一般吱殉。 火紅的嫁衣襯著肌膚如雪掸冤。 梳的紋絲不亂的頭發(fā)上厘托,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天,我揣著相機(jī)與錄音稿湿,去河邊找鬼铅匹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛饺藤,可吹牛的內(nèi)容都是我干的包斑。 我是一名探鬼主播,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼策精,長吁一口氣:“原來是場噩夢啊……” “哼舰始!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起咽袜,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤丸卷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后询刹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谜嫉,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年凹联,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了沐兰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,742評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蔽挠,死狀恐怖住闯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情澳淑,我是刑警寧澤比原,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站杠巡,受9級特大地震影響量窘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜氢拥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一蚌铜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嫩海,春花似錦冬殃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春耳璧,著一層夾襖步出監(jiān)牢的瞬間成箫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工旨枯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蹬昌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓攀隔,卻偏偏與公主長得像皂贩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子昆汹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評論 2 361

推薦閱讀更多精彩內(nèi)容