一、協(xié)議(protocol)的基本概念? ??
1窍仰、協(xié)議的聲明看起來比較類似一個(gè)類的接口文件将硝,不同的是協(xié)議沒有父類也不能定義實(shí)例變量。? ? ? 協(xié)議里面存放著方法的聲明哭尝,在該文件中并沒有實(shí)現(xiàn),誰遵守協(xié)議誰實(shí)現(xiàn)方法??
? 2哥攘、協(xié)議是一種特殊的程序設(shè)計(jì)結(jié)構(gòu),用于聲明專門被別的類實(shí)現(xiàn)的方法材鹦,協(xié)議在以下場合非常有用:? ? ??
?1)需要由別的類實(shí)現(xiàn)的方法? ? ?
?2)聲明未知類的接口? ? ?
?3)兩個(gè)雷之間的通信? ??
3逝淹、協(xié)議的基本特點(diǎn)? ? ?
?1)協(xié)議可以被任何類實(shí)現(xiàn)方法,協(xié)議本身不是類桶唐,他是定義了一個(gè)其他類可實(shí)現(xiàn)的接口栅葡,類目也可以采用協(xié)議? ? ? ?
?2)協(xié)議的關(guān)鍵字? ? ? ? ?
?@required:表示必須強(qiáng)制實(shí)現(xiàn)的方法? ? ? ? ?
?@optional:表示可以有選擇性的實(shí)現(xiàn)方法? ? ?
?3)實(shí)現(xiàn)的聲明與實(shí)現(xiàn)? ? ? ? ??
/* 協(xié)議的聲明 */? ? ? ??
? @protocol HelloProtocol<NSObject>
@optional ?
- (void)optionalMethod1; ? ? ? ? ?
- (void)optionalMethod2;? ? ? ? ?
?@required? ? ? ? ?
?- (void)requiredMethod1;? ? ? ? ?
?@end? ? ? ? ??
/* 協(xié)議的實(shí)現(xiàn) */? ? ? ? ??
@implementation Person? ? ? ? ??
- (void)requiredMethod1 {? ? ? ? ?
?} // 實(shí)現(xiàn)了該協(xié)議中的方法,且方法必須實(shí)現(xiàn)? ? ? ? ?
?- (void)optionalMethod1 {? ? ? ? ??
?} // 實(shí)現(xiàn)了該協(xié)議中的方法尤泽,可以選擇不實(shí)現(xiàn)? ? ? ? ?
?@end? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?/* 采用了該協(xié)議 */? ? ? ? ?
?@interface Person : NSObject
@end
二欣簇、委托(代理)設(shè)計(jì)模式 兩個(gè)對象協(xié)同解決問題,通常用于對象之間的通信
1坯约、指一個(gè)對象提供機(jī)會(huì)對另一個(gè)對象中的行為發(fā)生變化時(shí)做出的反應(yīng)
如:當(dāng)將一顆石子(對象1)丟入水中(行為發(fā)生變化熊咽,之前可能在你的手中)時(shí),水面(對象2)泛起波紋(做出的反應(yīng))
2闹丐、基本思想:
兩個(gè)對象協(xié)同解決問題网棍,通常用于對象之間的通信
3、基本特點(diǎn):
1)簡化了對象的行為妇智,最小化了對象之間的耦合度
2)使用代理滥玷,一般來說無需子類化
3)簡化了應(yīng)用程序開發(fā)氏身,既容易實(shí)現(xiàn),又靈活
三惑畴、 示例:中介找房
1蛋欣、假設(shè)有一個(gè)Jack的人(Person),他想租一套公寓(Apartment)如贷,由于他工作繁忙(或者其他原因)陷虎,沒有時(shí)間(或者自身沒有能力)去租房。因此杠袱,他委托中介公司(Agent)幫他尋找房源尚猿,找到合適的房源告知Jack。
2楣富、補(bǔ)充
1)定時(shí)器
一旦創(chuàng)建了一個(gè)定時(shí)器對象(NSTimer實(shí)例),他可以按照一定時(shí)間的間隔凿掂,將指定消息發(fā)送到目標(biāo)對象,并更新某個(gè)對象的行為纹蝴,你可以選擇在未來的某個(gè)時(shí)候?qū)⑺?開啟"庄萎,或者將它停止乃至銷毀。
2)NSRunloop
一個(gè)runloop就是一個(gè)事件處理的循環(huán)塘安,用來不斷的調(diào)度工作以及處理輸入事件糠涛,使用runloop的目的是讓你的線程在有工作的時(shí)候忙于工作,而沒有工作的時(shí)候處于休眠狀態(tài)
在我們的應(yīng)用程序中兼犯,不需要?jiǎng)?chuàng)建NSRunloop對象忍捡,因?yàn)椋谖覀兊闹骶€程中(包含其他子線程)系統(tǒng)會(huì)自動(dòng)穿件NSRunloop對象切黔,如果需要訪問當(dāng)前線程中的runloop砸脊,你可以通過類方法『currentRunloop』獲取到