-1

1>有没有其他方法可以使用/avail/consume协议而不这样做@interface MyClass : NSObject <SomeProtocol>

2> 如果不这样做,一个类是否可以成为委托类的代表@interface MyClass : NSObject <SomeProtocol>

3> 我对这些正确吗

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

AClass<bProtocol> *myVar2;这意味着myVar2它将持有一个对象AClass并且它还必须实现<bProtocol>

4> 这是在做什么(MyClass <someProtocol> *)[[MyClass alloc] init];,并且MyClass在它的界面中没有继承<someProtocol>.

4

2 回答 2

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. 在这里,您正在从将是myClassto的方法的返回类型执行转换myClass<someProtocol>。这本质上是您对编译器说“我知道该对象返回一个类型的对象,myClass但实际上我告诉您它将是myClass<someProtocol>”。本质上,如果myClass未定义为,@interface myClass : NSObject <someProtocol>那么您就是在对编译器撒谎,并且您有可能会引入编译器无法告诉您的错误。

您应该小心强制转换以使编译器静音(编译器非常聪明),例如我可以毫无问题地编译此代码,但它会在运行时崩溃

UIView *view = (id)@"Hey I'm not a view";
view.frame = CGRectZero;
于 2013-02-14T11:39:51.163 回答
0

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

有关更多信息,请参阅ios 协议文档

于 2013-02-14T12:05:32.017 回答