协议有什么意义?

时间:2011-05-04 09:16:14

标签: objective-c delegates protocols

我根据示例代码使用协议编写了​​各种各样的东西,但也使用了一些第三方的东西,他们似乎采用了截然不同的方法。一些使用

专门采用接口中的协议
@interface myClass <myProtocol>

其他人根本不这样做,只是传递自己,然后被设置为代表,但最终结果似乎完全相同。我试过了两个,他们都很好。如果有人能够解释这一点,我将是一个快乐的露营者!非常感谢。

3 个答案:

答案 0 :(得分:4)

协议声明一组对象必须响应的消息(或者@optional可以响应)。在Objective-C中,它唯一的点(几乎) * 是允许编译器在没有使用正确的签名传递没有实现协议的所有方法的对象时标记警告。

举一个简单的例子:NSMutalbeDictionary有一个方法-setObject:ForKey:,它设置特定键的值。密钥被声明为类型id,这意味着您可以传递任何对象,编译器不会抱怨。但是,该方法的文档说:

  

密钥被复制(使用copyWithZone:;密钥必须符合NSCopying协议)。

因此,如果您传递的对象没有-copyWithZone:方法,则会在运行时收到异常,说该密钥不响应-copyWithZone:。如果编译器可以检测到您的错误,那就太好了。

如果Apple宣布了方法

-(void)setObject:(id)anObject forKey:(id<NSCopying>)aKey;

编译器会知道-copyWithZone:的要求(它是NSCopying中声明的唯一方法)并且会捕获在编译时传递不兼容对象的任何实例。我认为他们没有这样做的原因是为了向后兼容。如果bbum正在阅读,他可能知道为什么不这样做。


* 我说“差不多”,因为你可以在运行时测试一个对象conforms to a protocol

答案 1 :(得分:1)

Objective-C可以同时执行静态和动态类型,因此通常的用例并不需要协议。您始终可以将您的委托键入id,然后将其发送给您想要的任何消息。 (如果您尝试发送当前文件中不可见的消息,编译器将发出警告。这是关于它可以对id进行的唯一完整性检查 - 没有进行高级类型推断的类型对象。)

但是使用协议缩小id类型很好并且建议使用,因为1)代码更易读,2)如果您尝试向代理发送一些虚假消息,编译器会发出警告3)您将获得更好的代码完成。

答案 2 :(得分:1)

如果使用协议,Xcode Code Sense也非常有用。有时它会暗示缺少方法。