iphone - 为什么 iPhone SDK 对某些委托(delegate)使用类别而不是协议(protocol)?

标签 iphone objective-c delegates protocols categories

我的理解是,协议(protocol)就像其他语言中的接口(interface)——它们声明预期的方法——而类别允许您向现有类型(甚至可能是您不拥有的类型)添加新方法。

那么,为什么 iPhone SDK 有时会使用类别来声明委托(delegate)类型?通常我希望所有委托(delegate)的类型都为 id,但有很多示例并非如此。

例如,参见 NSURLConnection。它的委托(delegate)类型为“id”,“契约(Contract)”被声明为 NSObject (NSURLConnectionDelegate) 上的一个类别。

那么:在这些情况下使用类别的动机是什么?

最佳答案

Objective-C 2.0 引入了@optional 协议(protocol)指令,允许您将某些协议(protocol)方法声明为可选。在 Obj-C 2.0 之前,类别用于允许可选的委托(delegate)方法(具体来说,NSObject 上的类别,称为非正式协议(protocol))。

我的猜测是,iPhone SDK 中使用的大部分类别而不是协议(protocol)是从等效的 Mac 类中继承而来的。例如,NSURLConnection 存在于 Mac 和 iPhone SDK 中,因此代码很可能是共享的。由于 Apple 尚未更改所有 Mac 类以使用正式协议(protocol),因此我们留下了一些不一致的地方。

关于iphone - 为什么 iPhone SDK 对某些委托(delegate)使用类别而不是协议(protocol)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/900335/

相关文章:

ios - 在 NSLog 中,方法返回一个颠倒的问号

C# 从 ThreadStart().Start() 返回值

c# - 通过反射将 Action<T> 传递给泛型方法?

iphone - 从 web View 中的有序列表中删除缩进

iphone - 如何防止标签栏 Controller 中的 View Controller 旋转?

ios - 复制 UIAlertController 按钮行为

objective-c - 调试时是否可以跳转到循环的特定迭代?

objective-c - 应用委托(delegate) - Cocoa

iphone - 带有 super View 的 iOS 统一缩放 subview

iphone - 如何让多个触摸按钮与 TouchBegan/Moved 一起使用?