2013-02-14 80 views
-1

1>是否有任何其他方式使用/使用/使用協議,而無需這樣做@interface MyClass : NSObject <SomeProtocol>需要關於objective-c協議的幾個概念的幫助

2>一個班級是否可以成爲授權班的委託人而不需要這樣做@interface MyClass : NSObject <SomeProtocol>

3>我是正確有關這些

id<aProtocol> *myVar1;這意味着myVar1將持有任何類的對象,但類必須實現<aProtocol>

AClass<bProtocol> *myVar2;這意味着myVar2將持有AClass的對象,它還必須實現<bProtocol>

4>這是什麼東西在它的界面繼承<someProtocol>(MyClass <someProtocol> *)[[MyClass alloc] init];MyClass

+0

最近的票數是多少? OP已經提出了直接的問題,這些問題比通常的'我寫了一些代碼...它不起作用 - 幫助'風格的問題總是被問到。 – 2013-02-14 11:59:00

+0

也可能值得注意的是,您不會「繼承」協議,而是「符合」協議。在Paul的回答如下,類'myClass'符合協議'someProtocol'(你應該大寫類,協議和類別名稱)。 – wmorrison365 2013-02-14 12:01:43

+0

@ wmorrison365感謝您指出類命名約定。 – 2013-02-14 12:37:11

回答

2
  1. 是的,只要一個對象實現了協議所需的接口,那麼該對象本質上可以代表一個明確符合協議的對象。如果你這樣做,那麼你會放棄編譯器幫助你確認你實現了所需的方法。所以通常最好是明確的,並聲明你的類符合協議。

    當我說as long as an object implements the required interface of the protocol我的意思是,該對象非正式地符合這個意義上說,它實現了所需的方法,但沒有明確表示它試圖符合。例如這個對象將是一個有效的UITableViewDataSource,因爲它實現了@required方法,但它只是不聲明。

    @interface MyObject : NSObject 
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; 
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; 
    @end 
    

    同樣,你應該只讓這些關係清晰,居然說你符合與@interface MyObject : NSObject <UITableViewDataSource>

  2. 一)id<aProtocol> *myVar1;應該沒有星號id<aProtocol> myVar1;寫,這是說你有一個叫做變量myVar1這應該符合aProtocol - 這可能是一個謊言(見答案3)
    b)這是正確的,除了it must also implement <bProtocol>太強,這是什麼意思是,你有一個變量,名爲myVar2並應符合bProtocol - 再次,這可能是一個謊言(見回答3)

  3. 在這裏,您是從的返回類型進行投方法將是myClassmyClass<someProtocol>。這實際上是你對編譯器說的「我知道該對象返回一個類型爲myClass的對象,但我真的告訴​​你它將是myClass<someProtocol>」。本質上,如果myClass沒有被定義爲@interface myClass : NSObject <someProtocol>,那麼你對編譯器說謊,並且有可能會引入編譯器無法告訴你的錯誤。

你應該小心鑄造的事情保持沉默的編譯器(編譯器是非常聰明的),例如,我可以編譯這段代碼沒有任何問題,但它會在運行時崩潰

UIView *view = (id)@"Hey I'm not a view"; 
view.frame = CGRectZero; 
+0

對於(2b)我認爲你的意思是''。 – wmorrison365 2013-02-14 11:53:27

+0

@ wmorrison365歡呼 – 2013-02-14 11:56:40

+0

@ Paul.s非常感謝您的回覆。我沒有得到這一點「對象實現協議所需的接口」,你的意思是這樣的MyClass ? – 2013-02-14 12:41:26

0

爲了補充Paul.s的回答是,還有一種「非正式協議」的概念,它不必在客戶端代碼中被採用(因爲非正式協議實際上是NSObject上的一個類別,而不是一個協議)。這個概念現在已經在很大程度上被協議中的「可選」方法的概念取代(該協議可以聲明方法,可以選擇在您的myClass中實現)。

有關更多信息,請參閱ios protocol docs