需要有关Objective-c协议的几个概念的帮助

时间:2013-02-14 11:19:33

标签: ios objective-c protocols

1&GT;有没有其他方法可以使用/ avail / consume协议而不执行此@interface MyClass : NSObject <SomeProtocol>

2 - ;如果不执行此@interface MyClass : NSObject <SomeProtocol>,类可以成为委派类的委托。

3&GT;我对这些

是否正确

id<aProtocol> *myVar1;这意味着myVar1将保留任何类的对象,但该类必须实现<aProtocol>

AClass<bProtocol> *myVar2;这意味着myVar2将保留AClass的对象,并且还必须实现<bProtocol>

4&GT;这是(MyClass <someProtocol> *)[[MyClass alloc] init];MyClass在其界面而不是继承<someProtocol>时的行为。

2 个答案:

答案 0 :(得分: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. a) 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>,那么您对编译器撒谎,并且您可能会引入编译器无法告诉您的错误。

  4. 你应该小心铸造东西以使编译器静音(编译器非常聪明),例如我可以编译这段代码而没有任何问题,但它会在运行时崩溃

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

答案 1 :(得分:0)

为了补充Paul.s的答案,还有一个“非正式协议”的概念,它不必被客户端代码采用(因为非正式协议实际上是NSObject上的类别,而不是协议) 。现在,这个概念在很大程度上取代了协议中“可选”方法的概念(协议可以声明可以选择在myClass中实现的方法)。

有关详细信息,请参阅ios protocol docs