能,一般用的場合是陷舅,有兩個類A和B倒彰,如果A和B不是繼承關系,想給A和B增加幾個相同的屬性莱睁,可以實現(xiàn)一個協(xié)議C狸驳,加個屬性,然后讓A和B都遵循C協(xié)議就可以了缩赛。當然協(xié)議中只是聲明了屬性耙箍,在A和B里還要手動實現(xiàn)以下setter和getter方法才行。
協(xié)議中能夠聲明方法酥馍,以及屬性辩昆。然后問題就來了,不是不能定義成員變量的嗎旨袒?
對汁针,的確不能定義成員變量,但是屬性是什么砚尽?屬性包含了三個東西:成員變量施无、setter方法、getter方法必孤。在類中定義的屬性猾骡,當然三者都有,然而協(xié)議中定義的屬性只有獲取和設置方法敷搪,沒有成員變量兴想,這就要求該協(xié)議的遵守者必須自己寫出setter和getter方法的實現(xiàn)。但是有一種情況是不需要的赡勘,那就是遵守者本來就有這個屬性嫂便,此時系統(tǒng)會為這個屬性自動生成設置獲取方法,既然已經實現(xiàn)了闸与,那么遵守者就沒必要去實現(xiàn)協(xié)議中的這個屬性了毙替。
盡管可以實現(xiàn)“偽屬性”,但是践樱,我們還是應該盡量把屬性定義在主接口中厂画,而不應該定義在協(xié)議中。
還有一點映胁,也是很重要的一點木羹,為什么自定義的協(xié)議后面會有這么一個東西<NSObject>?
協(xié)議也能繼承。既可以繼承自自定義的協(xié)議,也可以繼承自系統(tǒng)的協(xié)議坑填。
我們在定義協(xié)議的時候抛人,一般都是直接繼承自<NSObject>,為什么系統(tǒng)要默認讓協(xié)議繼承自這個協(xié)議呢脐瑰?
因為這個協(xié)議中定義了一些基本的方法妖枚,由于我們使用的所有類都繼承NSObject這個基類,而這個基類遵守了<NSObject>這個協(xié)議苍在,那么也就實現(xiàn)了其中的那些方法绝页,這些方法當然可以由NSObject及其子類對象調用,但是在不知道遵守者類型的時候需要用到id <協(xié)議名>這樣的指針寂恬,這個指針在編譯期并不知道自己指向哪個對象续誉,唯一能調用的便是協(xié)議中的方法,然而有時候又需要用一些基本的方法初肉,比如要辨別id <協(xié)議名>這個指針所指的對象屬于哪個類酷鸦,就要用到-isMemberOf:這個方法,而這個方法是<NSObject>這個協(xié)議中的方法之一牙咏,所以臼隔,我們自定義的協(xié)議都需要繼承<NSObject>。本段一開始便說道:<NSObject>中的方法在NSObject基類中實現(xiàn)了妄壶,那么無需再關心實現(xiàn)了摔握,直接調用<NSObject>中的方法吧。
需要注意的問題
根據(jù)約定丁寄,框架中后綴為Delegate的都是Protocol氨淌,例如UIApplicationDelegate,UIWebViewDelegate等狡逢。
Protocol本身是可以繼承的宁舰,比如:
@protocol A
-(void)methodA;
@end
@protocol B <A>
-(void)methodB;
@end
如果你要實現(xiàn)B,那么methodA
和methodB
都需要實現(xiàn)奢浑。
Protocol是與任何類都無關的,任何類都可以實現(xiàn)定義好的Protocol腋腮,如果我們想知道某個類是否實現(xiàn)了某個Protocol雀彼,那么我們可以用conformsToProtocol:
方法進行判斷:
[obj conformsToProtocol:@protocol(ProcessDataDelegate)]