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>
时的行为。
答案 0 :(得分:2)
是的,只要一个对象实现了协议所需的接口,那么该对象就可以基本上代表一个明确符合协议的对象。如果您这样做,那么您将松开编译器,帮助您确认是否实现了所需的方法。因此,通常最好只是明确并声明您的类符合协议。
当我说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>
a) id<aProtocol> *myVar1;
应该在没有星号id<aProtocol> myVar1;
的情况下编写,这就是说你有一个名为myVar1
的变量应该符合aProtocol
- 这可能是谎言(见答案3)
b)这是正确的,除了it must also implement <bProtocol>
太强了,这说的是你有一个名为myVar2
的变量,它应该符合bProtocol
- 再次,这可能是一个谎言(见答案3)
在这里,您要从方法的返回类型执行强制转换,该转换类型为myClass
到myClass<someProtocol>
。这基本上是你对编译器说“我知道对象返回一个myClass
类型的对象,但实际上我告诉你它将是myClass<someProtocol>
”。基本上,如果myClass
未定义为@interface myClass : NSObject <someProtocol>
,那么您对编译器撒谎,并且您可能会引入编译器无法告诉您的错误。
你应该小心铸造东西以使编译器静音(编译器非常聪明),例如我可以编译这段代码而没有任何问题,但它会在运行时崩溃
UIView *view = (id)@"Hey I'm not a view";
view.frame = CGRectZero;
答案 1 :(得分:0)
为了补充Paul.s的答案,还有一个“非正式协议”的概念,它不必被客户端代码采用(因为非正式协议实际上是NSObject上的类别,而不是协议) 。现在,这个概念在很大程度上取代了协议中“可选”方法的概念(协议可以声明可以选择在myClass
中实现的方法)。
有关详细信息,请参阅ios protocol docs。