2014-11-02 15 views
0

試圖瞭解協議及其使用......困難時期。我讀得越多,我甚至就能夠制定關於它們的問題。我已經讀過一百次聲明「一個協議是合同」,但它只是不點擊。誰在objective-c中使用協議做什麼?

我「只」想開發真正簡單的應用程序,所以假設我不會爲我的任何類創建一個協議。

例如,我想使用Apple的Scenekit框架,並瞭解我需要實現一些方法來完成此操作 - 例如SCNSceneRendererDelegate。具體

@interface AAPLGameViewController : UIViewController <SCNSceneRendererDelegate> 

尖括號之間的位:編譯器強制執行這一點,它知道這樣做,因爲在我的頭文件我已經插入。

對於我要實現的功能的原型,我去看看在SCNSceneRendererDelegate頭文件

@protocol 
... 
@end 

部分。

但是現在我遇到了一些@properties部分(例如在UIApplication頭文件中)的@protocol部分!我認爲@protocol只是爲了實現某些方法,那裏有什麼屬性?

我還遇到了其中一個答案,在創建對象實例時指定協議名稱允許我使用我一無所知的對象。我將非常感謝能夠得到幾個有用的簡單實例。

最後,在Java中,(Obj-C)@protocols的對應部分被稱爲接口。 Java中的對象(Obj-C)@interface是否存在?

非常感謝,歡呼聲。

+0

Java中Obj-C接口的近似副本是公共類聲明,沒有任何方法實現。接口說明了其他類(包括子類和單元測試)可以調用的方法以及它們可以訪問哪些變量。 – 2014-11-03 05:48:29

回答

1

堅持一個協議告訴其他類,你的類有一個特定的一組特徵。通常,協議用於定義特定類應該具有的方法,以便它可以作爲另一個類的委託,這意味着採用該協議的類可以保證定義了委託類在回調中調用的必需方法。如果協議定義了一個屬性,它只是意味着採用該協議的任何類都應該擁有該屬性。例如:

@protocol MyProtocol <NSObject> 

@required 

@property (readonly) NSString *title; 

@optional 

- (void) someMethod; 

@end 

現在我可以在任何地方,它接受一個對象符合MyProtocol因爲它是保證採用MyProtocol所有類存在安全訪問title屬性來定義的方法。

-(void)printTitleOfObject:(id<MyProtocol>)object { 
    NSLog(@"%@", object.title); 
} 

因此,即使id可以是任何對象,因爲我們知道,它符合我們的協議,我們知道它有title財產。當人們說「協議是合同」時,他們的意思是即使我們不明確哪個類正在採用該協議,我們知道它至少具有協議中所要求的方法和屬性。指定一個類的協議可以讓我們知道一些關於它的信息,即使我們不知道它是什麼類。

蘋果已寫入documentation for protocols they've written, like the SCNSceneRendererDelegate you mentioned in your question

+0

>「遵守協議告訴其他班級你的班級有一套特定的特徵」 好吧!我總是從另一個方向來看待它,即**另一個**班正在告訴我的班級他們需要實施具體的方法。這是一個新的有希望的觀點。謝謝:)現在我仍然無法想象它會如何實現,就像你的例子一樣,我會收到一個我一無所知的對象。我認爲在編寫應用程序時,我必須實例化幾乎所有使用的對象。 – 2014-11-03 11:54:54

+0

考慮一個需要委託的類'ClassWithDelegate'。這個類並不需要知道委託是什麼,事實上,如果委託實際只需要一個或兩個方法/屬性,則可能會限制爲委託指定類型。 'ClassWithDelegate'會更好地將其委託屬性存儲爲'id 類型'的某種類型,而不是像專門的'ClassWithDelegateDelegate *'類那樣委託代理將不得不繼承子類。 – 2014-11-03 16:46:32

+0

爲了進一步闡明,如果我們假裝協議不存在,並且我們必須爲我們的代表有一個專門的類,那麼我們最終會因爲[Objective-C不直接支持多重繼承]而承受很多程序員的痛苦(http:// support .apple.com/KB/TA45894)。 – 2014-11-03 16:47:44

0

但現在我已經遇到了一些@protocol部分(例如,在 UIApplication的頭文件)包含@properties!我認爲 @protocol只是關於實現某些方法,什麼是 屬性在那裏做?

屬性方法。屬性聲明只是一個getter-setter方法對的聲明(或者是隻讀屬性,只是一個getter方法),並允許編譯器將點符號訪問轉換爲對此getter和setter的調用。這是一個屬性。如何實現getter/setter(無論是手動實現還是合成),以及它是否反映基礎值(或從其他事物計算)都是getter/setter方法的私有實現細節。

+0

啊哈!我一直認爲屬性是實例變量。但現在 - 顯然:) - 我會把它們看作一個實例變量和getter和setter方法。謝謝。 – 2014-11-03 12:01:02

+0

@WS:但不一定有一個實例變量。如果它是合成的,編譯器爲你添加一個實例變量;否則,您的getter/setter方法可能會或可能不會使用實例變量。隨你便。 – newacct 2014-11-03 17:42:40