我一直在根据示例代码使用协议(protocol)编写各种内容,但也使用一些第三方内容,他们似乎采用了完全不同的方法。一些专门采用界面中的协议(protocol)使用
@interface myClass <myProtocol>
其他人根本不这样做,只是通过自己,然后被设置为委托(delegate)人,但最终结果似乎完全一样。我都试过了,它们都工作正常。如果有人能够解释这一点,我会成为一个快乐的露营者!非常感谢。
最佳答案
一个协议(protocol)声明了一组对象必须响应的消息(或者使用@optional
,可以响应)。在 Objective-C 中,它唯一的一点(几乎)* 是允许编译器在您传递的对象未实现具有正确签名的协议(protocol)的所有方法时发出警告。
举个简单的例子:NSMutalbeDictionary有一个方法-setObject:ForKey:它设置特定键的值。键被声明为 id
类型,这意味着您可以传递任何对象并且编译器不会报错。但是,该方法的文档说:
The key is copied (using copyWithZone:; keys must conform to the NSCopying protocol).
因此,如果您传递一个没有 -copyWithZone:
方法的对象,您将在运行时得到一个异常,指出该键没有响应 -copyWithZone:
。如果编译器能够检测到您的错误,那就太好了。
如果 Apple 声明了该方法
-(void)setObject:(id)anObject forKey:(id<NSCopying>)aKey;
编译器会知道 -copyWithZone:
的要求(这是 NSCopying 中声明的唯一方法)并且会在编译时捕获任何传递不兼容对象的实例。我认为他们不这样做的原因是为了向后兼容。如果 bbum 正在读书,他可能知道不读书的真正原因。
*我说“几乎”是因为你可以测试一个对象是否conforms to a protocol在运行时。
关于objective-c - 协议(protocol)的重点是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5881163/