Protocol
Protocol,簡單來說就是一系列不屬于任何類的方法列表,其中聲明的方法可以被任何類實現(xiàn)。這種模式一般稱為代理(delegation)模式。你通過Protocol定義各種行為,在不同的場景采用不同的實現(xiàn)方式。在iOS和OS X開發(fā)中,Apple采用了大量的代理模式來實現(xiàn)MVC中View和Controller的解耦。
定義Protocol很簡單,在聲明文件(h文件)中通過關(guān)鍵字@protocol定義,然后給出Protocol的名稱,方法列表,然后用@end表示Protocol結(jié)束。在@end指令結(jié)束之前定義的方法,都屬于這個Protocol。例如:
@protocol ProcessDataDelegate <NSObject> @required - (void) processSuccessful: (BOOL)success;@optional - (id) submitOrder: (NSNumber *) orderid; @end以上代碼可以單獨放在一個h文件中,也可以寫在相關(guān)類的h文件中,可以視具體情況而定。該P(yáng)rotocol包含兩個方法,processSuccessful和submitOrder。這里還有兩個關(guān)鍵字,@required和@optional,表示如果要實現(xiàn)這個協(xié)議,那么processSuccessful方法是必須要實現(xiàn)的,submitOrder則是可選的,這兩個注解關(guān)鍵字是在Objective-C 2.0之后加入的語法特性。如果不注明,那么方法默認(rèn)是@required的,必須實現(xiàn)。
那么如何實現(xiàn)這個Protocol呢,很簡單,創(chuàng)建一個普通的Objective-C類,取名為TestAppDelegate,這時會生成一個h文件和m文件。在h文件中引入包含Protocol的h文件,之后聲明采用這個Protocol即可,如下:
@interface TestAppDelegate : NSObject<ProcessDataDelegate>;@end用尖括號(<…>)括起來的ProcessDataDelegate就是我們創(chuàng)建的Protocol。如果要采用多個Protocol,可以在尖括號內(nèi)引入多個Protocol名稱,并用逗號隔開即可。例如<ProcessDataDelegate,xxxDelegate>
m文件如下:
@implementation TestAppDelegate- (void) processSuccessful: (BOOL)success{if (success) {NSLog(@"成功");}else {NSLog(@"失敗");} }@end由于submitOrder方法是可選的,所以我們可以只實現(xiàn)processSuccessful。
Protocol一般使用在哪些場景呢?Objective-C里的Protocol和Java語言中的接口很類似,如果一些類之間沒有繼承關(guān)系,但是又具備某些相同的行為,則可以使用Protocol來描述它們的關(guān)系。不同的類,可以遵守同一個Protocol,在不同的場景下注入不同的實例,實現(xiàn)不同的功能。其中最常用的就是委托代理模式,Cocoa框架中大量采用了這種模式實現(xiàn)數(shù)據(jù)和UI的分離。例如UIView產(chǎn)生的所有事件,都是通過委托的方式交給Controller完成。根據(jù)約定,框架中后綴為Delegate的都是Protocol,例如UIApplicationDelegate,UIWebViewDelegate等,使用時大家可以留意一下,體會其用法。
使用Protocol時還需要注意的是:
1、Protocol本身是可以繼承的,比如:
@protocol A-(void)methodA; @end @protocol B <A>-(void)methodB; @end如果你要實現(xiàn)B,那么methodA和methodB都需要實現(xiàn)。
2、Protocol是類無關(guān)的,任何類都可以實現(xiàn)定義好的Protocol。如果我們想知道某個類是否實現(xiàn)了某個Protocol,還可以使用conformsToProtocol進(jìn)行判斷,如下:
[obj conformsToProtocol:@protocol(ProcessDataDelegate)]好吧,具體的語言特性這次就介紹這么多。從某種意義上來說,Objective-C是一門古老的語言,發(fā)明于1980年。1988年,喬布斯的Next公司獲得了Objective-C語言的授權(quán),并開發(fā)出了Objective-C的語言庫和NEXTSTEP的開發(fā)環(huán)境。NextStep是以Mach和BSD為基礎(chǔ),Objective-C是其語言和運(yùn)行庫,后來的事大家都清楚,蘋果買了Next,喬布斯回歸蘋果,開始神奇的蘋果振興之路,NextStep成了Max OS X的基礎(chǔ)。以后發(fā)展越來越好,Objctive-C成了Apple的當(dāng)家語言,現(xiàn)在基本上是Apple在維護(hù)Objctive-C的發(fā)展。
在蘋果的AppStore推出之前,Objective-C一直相對小眾,但是其優(yōu)秀的語言特性似乎一直在為后面的爆發(fā)積蓄力量,當(dāng)蘋果平臺級的應(yīng)用出現(xiàn)之后,Objective-C開始大放異彩,靜態(tài)語言的效率和動態(tài)語言的特性得到眾多程序員的喜愛,目前它已經(jīng)以火箭般的速度躥升TIOBE語言排行版第四位。
對于喜愛蘋果技術(shù)的技術(shù)人員來說,Objective-C是你必須深入了解和值得學(xué)習(xí)的一門語言,希望以后有機(jī)會多寫一些相關(guān)的文章。
轉(zhuǎn)載于:https://www.cnblogs.com/killiancheung/p/4635142.html
總結(jié)
- 上一篇: 常用html标签
- 下一篇: UITableVIew的性能优化-重用原