delegate和protocol

協議和代理對於一個新手來講確實不討好理解,也有不少的iOS開發的老手對此是懂非懂的。網上的不少博文只是講了怎麼使用,並無說的很明白。下面我談一下個人理解。編程

1.你要先搞明白,協議和代理爲何會出現,也就是說它存在的意義是什麼,解決了什麼問題。

協議和代理是模塊化開發和封裝的產物。
先講一個小故事幫助你們理解:模塊化

老王有一家餐館,剛剛開始的時候規模很小,因此老王一我的作了全部的事情:掃地,作菜,迎賓,上菜,收銀。可是後面隨着規模的擴大,老王一我的就吃不消了,忙死也忙不過來了。這時候怎麼辦?你們都很清楚吧,招人唄!因此後面就有了服務員,收銀員,大廚,保潔員。
這就意味着原先老王的工做按模塊進行了拆分。ui

老王開餐館

餐館的工做流程(業務邏輯)簡單來講是這樣的:點餐->作菜->上菜->收銀->打掃衛生。atom

轉換成編程世界的模型就是這樣的:業務不是很複雜的時候,咱們把全部的功能都寫在一個類裏面,這個類暫且叫老王,理論上全部的事情和功能均可以寫到這個類裏面。作菜方法,上菜方法,打掃方法......就形成了老王這個類很是的龐大和臃腫,而且容易出錯。spa

那咱們開始招人了,新建了大廚類,服務員類,收銀類,保潔類,這四個類。大廚類有作菜方法,服務員類點菜,上菜方法,收銀類有收銀方法,保潔類有打掃方法。代理

僅僅這樣仍是不行的,由於模塊開發必然就有模塊分化之後模塊之間的通訊問題。大廚類只作菜 可是菜作好了怎麼辦,必須及時的上菜,讓顧客享用。可是大廚本身不能上菜,因此大廚必須拋出菜作好了的信號,具體這個菜上不上,怎麼上,就不是大廚關心的了。code

2.協議和代理所發揮的做用

老王交代大廚,你只管作菜,菜作好了之後喊一聲菜作好了(我見過一個餐館是拉鈴鐺)。
那麼老王跟大廚定的這個規矩就是協議(protocol),下面看代碼:模塊化開發

DaChu.h

/** * 下面是聲明協議的固定格式,DaChuDelegate是協議的名稱,由於是代理協議,名稱格式爲:類名+Delegate */ @protocol DaChuDelegate <NSObject> - (void)doSomethingAftercaiZuohaole; @end @interface DaChu : NSObject /** * delegate 是dachu類的一個屬性,weak 關鍵字是爲了不循環引用,<DaChuDelegate>表示遵照DaChuDelegate協議 * 更加直白點:在大廚內心有一我的接受他的菜好了的信號去作一些事情,具體這我的是誰,大廚不關心,這我的的代號是delegate */ @property (nonatomic, weak) id <DaChuDelegate> delegate; - (void)kaiShiZuoCai; @end
Dachu.m
#import "DaChu.h" @implementation DaChu - (void)kaiShiZuoCai{ NSLog(@"開始作菜"); sleep(2); NSLog(@"作好菜了,該上菜了"); //下面這句是判斷 一下delegate是否實現了doSomethingAftercaiZuohaole方法,若是delegate沒有實現 //直接[self.delegate doSomethingAftercaiZuohaole];會crash if ([self.delegate respondsToSelector:@selector(doSomethingAftercaiZuohaole)]) { [self.delegate doSomethingAftercaiZuohaole]; } } @end

下面看一看laowang這個類裏面的內容開發

#import "LaoWang.h" #import "DaChu.h" @interface LaoWang ()<DaChuDelegate>//<DaChuDelegate>表示遵照DaChuDelegate協議,而且實現協議裏面的方法 @end @implementation LaoWang - (void)laoWangKaiYe{ NSLog(@"老王開業了"); DaChu *dachu1 = [[DaChu alloc] init]; dachu1.delegate = self;//說明老王充當代理的角色,負責接收菜好了的信號。 [dachu1 kaiShiZuoCai];//大廚開始作菜 } - (void)doSomethingAftercaiZuohaole{ NSLog(@"老王知道了");//這裏能夠通知服務員去上菜了 } @end

上面的這個過程,也能夠看下圖來理解:
代理和協議
關於協議的理解,你們還能夠參考這篇博文。string

相關文章
相關標籤/搜索