Protocol Object(協議物件)

翻譯自:Objective-C Runtime Programming Guide   chapter 4

就像是runtime時,classesclass objects表示,方法由selector code表示,正式協議也被特殊形式的data表示,就是Protocol類的實例。Source code處理協議時(而不是用來做為type specification)必須參考(refer to)對應的protocol object

很多方面而言,protocols都很像class definitions。它們都宣告方法,並且在runtime時由物件表示,類是由Class實例,協議由Protocol實例。就像類物件,protocol objects會自動從在源碼中找到並由runtime system使用的定義和宣告自動創建。它們不是在程式元碼中被分配和初始化的。

源碼使用@protocol()指令去參考協議,跟宣告協議的指令一樣,除了尾部有一組圓括號,這括號包含了協議名稱:

Protocol *myXMLSupportProtocol = @protocol(MyXMLSupport);

這是源碼惟一能想起協議物件的方法。不像class nameprotocol name不會指明物件,除了在@protocol()裡面。

編譯器為每個它遇到的協議宣告創造一個協議物件,但只有協議也是:
被一個類採用(Adopted by a class, or)或是
參考源碼中的某處(使用@protocol)(Referred to somewhere in source code(using @protocol()))

被宣告但沒用到的協議(除了用於之後所講的type checking)不會在runtime時被協議物件表示。

留言