objective-c - 协议(protocol)的重点是什么?

标签 objective-c delegates protocols

我一直在根据示例代码使用协议(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/

相关文章:

objective-c - 当我从 UITableViewController 打开自定义 UIView 时,如何关闭自定义 View 并返回 TableView ?

ios - 应用程序启动时在其他 View Controller 之上显示 View Controller 在 ios8 中不起作用

c# - 编译器生成的事件的支持字段是否始终保证使用与事件相同的名称?

ios - 在 Xamarin 中绑定(bind) Block 的方法

swift - 符合协议(protocol)时类型别名声明的冗余重复(第 2 部分)

swift - 使用 Swift 计算最高和最低有效字节(MSB、LSB)

objective-c - 无法分配 self.delegate 它会产生无法识别的选择器发送

objective-c - 应用程序崩溃 - 调试显示 "objc_msgsend"

iphone - 一个对象可以作为多个委托(delegate)人的委托(delegate)吗?

swift - 如何使 ViewController 类符合协议(protocol)并将其设置为 "self"