2013-02-14 90 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