Objective c 协议的意义是什么?

Objective c 协议的意义是什么?,objective-c,delegates,protocols,Objective C,Delegates,Protocols,我根据示例代码使用协议编写了各种各样的东西,但也使用了一些第三方的东西,它们似乎采用了完全不同的方法。有些具体采用接口中的协议,使用 @interface myClass <myProtocol> @接口myClass 其他人根本不这样做,只是通过自己,然后被设定为代表,但最终结果似乎完全一样。我两个都试过了,都很好用。如果有人能解释这一点,我会是一个快乐的露营者!非常感谢。Objective-C可以同时进行静态和动态输入,因此通常情况下并不需要协议。您可以始终将您的代理键入为i

我根据示例代码使用协议编写了各种各样的东西,但也使用了一些第三方的东西,它们似乎采用了完全不同的方法。有些具体采用接口中的协议,使用

@interface myClass <myProtocol>
@接口myClass

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

Objective-C可以同时进行静态和动态输入,因此通常情况下并不需要协议。您可以始终将您的代理键入为
id
,然后发送您想要的任何消息。(如果您试图发送当前文件中不可见的消息,编译器将向您发出警告。这是它在不进行高级类型推断的情况下,可以对
id
-类型化对象执行的唯一完整性检查。)


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

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

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

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

因此,如果您传递一个没有
-copyWithZone:
方法的对象,您将在运行时收到一个异常,表示该键不响应
-copyWithZone:
。如果编译器能够检测到您的错误,那就太好了

如果苹果宣布了这个方法

-(void)setObject:(id)anObject forKey:(id<NSCopying>)aKey;
-(void)setObject:(id)anObject forKey:(id)aKey;
编译器应该知道
-copyWithZone:
(这是中声明的唯一方法)的要求,并且应该在编译时捕获任何传递不兼容对象的实例。我认为他们没有这样做的原因是为了向后兼容。如果bbum正在读取,他可能知道不这样做的真正原因



*我说“差不多”因为您可以在运行时测试对象是否可用。

如果您使用协议,Xcode代码的意义也会非常有用。有时它会提示缺少的方法。

非常感谢大家-我现在看到了它的帮助,很高兴看到人们做了一些事情来让我们的生活更轻松!我也可以看到它是如何让代码变得更加丰富的可重用,因为如果您不符合要求,它会让您知道(是的,一两周后我确实忘记了我写的东西…)