這兩個概念困擾我很久了,一直都很像搞清楚到非正式協議和正式協議有什麼區別和聯絡,下面結合網上的資料和自己的看法談談這個問題。
一、非正式協議
顯然這個名詞是相對於正式協議而言的。在解釋非正式協議之前,先引用兩段話:
1、在《cocoa設計模式》第六章類別的6.3.2把類別用於非正式協議一節中,這樣寫到:
非正式協議通常定義為nsobject的類別。類別介面中指定的方法可能會或者可能不會被框架類實際地實現。非正式協議位於一種設計灰區中。正式協議由編譯器檢查並且代表一種關於物件能力的保證,但是非正式協議不會做出保證----而只會給出提示。
3、到底什麼是非正式協議
綜合1、2兩段引文可以看出,所謂的非正式協議就是類別,即凡是nsobject或其子類的類別,都是非正式協議。
4、類別和匿名類別
類別的寫法:
[cpp]view plain
copy
@inte***ce nsstring (camelcase) //類別
-(nsstring*) camelcasestring;
@end
這裡的camelcase就是類別名稱,跟類名一樣不能重複。總所周知,類別只能增加方法,不能增加例項變數,但是類別還有下面這樣一種寫法:
[cpp]view plain
copy
@inte***ce myclass ()
- (void)setvalue:(float)newvalue;
@end
這種寫法的類別叫匿名類別,又叫類擴充套件,所謂的擴充套件,其實就是為乙個類新增額外的原來沒有的變數、方法或者合成屬性。
類別與類擴充套件的區別:
①類別中只能增加方法;
②是的,你沒看錯,類擴充套件不僅可以增加方法,還可以增加例項變數(或者合成屬性),只是該例項變數預設是@private型別的(作用範圍只能在自身類,而不是子類或其他地方);
③類擴充套件中宣告的方法沒被實現,編譯器會報警,但是類別中的方法沒被實現編譯器是不會有任何警告的。這是因為類擴充套件是在編譯階段被新增到類中,而類別是在執行時新增到類中。
④類擴充套件不能像類別那樣擁有獨立的實現部分(@implementation部分),也就是說,類擴充套件所宣告的方法必須依託對應類的實現部分來實現。
⑤定義在 .m 檔案中的類擴充套件方法為私有的,定義在 .h 檔案(標頭檔案)中的類擴充套件方法為公有的。類擴充套件是在 .m 檔案中宣告私有方法的非常好的方式。
二、正式協議
正式協議從概念上理解起來就簡單的多了,它指的是乙個以@protocol方式命名的方法列表,與非正式協議相比不同的是,它要求顯示的採用協議。
1、正式協議的方法型別
正式協議宣告的方法有兩種型別的:
①@required
該類的方法在遵守相應協議的類中是必須被實現的,不然編譯器會告警(顯然這是在編譯時做的檢查,而不是在執行時)
②@optional
該類的方法在遵守相應協議的類中是否實現是可選的
2、正式協議存在的意義
從字面上理解,正式協議比非正式協議要正式了很多,它存在的意義在於:
正式協議可以將業務中的方法定義剝離出來,形成乙個單獨的檔案,這跟傳統oo中的提取介面是不謀而合的。如果遇到二個系統需要交換資料,可以制定一套雙方都遵守的協議,然後這二個系統中都把這個協議檔案新增到專案中,實現它即可。
3、繼承性
正式協議和類一樣,是可以繼承的,書寫格式同類繼承相似:
[cpp]view plain
copy
@protocol newprotocal
類別,非正式協議,正式協議
類別,非正式協議,正式協議 1類別 1.1 不能新增新的例項變數 1.2 如果一定要在類別中使用例項標量,可以使用全域性變數 關聯 額外變數 注 cocoa中沒有任何真正的私有方法,只要知道物件支援的某個方法名稱,即使.h中沒有宣告,也可以呼叫該方法。個人理解是oc的動態機制 2非正式協議 即建立乙...
非正式協議與正式協議的區別
非正式協議是 類的範疇類 範疇類是語言特徵。通過它,您無需子類化就向某個類增加方法 這意味著幾乎所有的物件都是非正式協議的採納者。非正式協議中的方法不必全部實現。在呼叫某個方法之前,呼叫物件會先檢查目標物件是否實現此方法。在可選協議方法被引入 objective c 2.0 之前,非正式協議實質上是...
非正式專案管理
最近在思考自己前乙個專案所做的過程,專案管理遠遠不是書本上所講的那麼簡單,所以,在實際中去體會,在實際中去提高.就象打仗,必須自己先要有過硬的武功,在戰爭中殺出血路,才可能逐漸成長成將軍或統帥.把這幾天思考和參考別人的經驗總結一下 1.明確專案的目的與建設目標 2.專案中牽扯的人之間的關係 投資方 ...