tutorial - objective-c版本




协议与类别 (5)

一个协议说,“这里有一些方法,我希望执行。” 一个类别说:“我用这些额外的方法扩展了这个类的功能”。

现在,我怀疑你的困惑源于苹果使用“非正式协议”这个短语。 这是关键(也是最令人困惑的):非正式协议实际上并不是协议。 它实际上是NSObject的一个类别。 可可使用非正式的协议来为代表提供接口。 由于@protocol语法在Objective-C 2.0之前不允许使用可选方法,所以Apple实现了可选方法,无需执行任何操作(或返回一个虚拟值)以及所需的方法来引发异常。 没有办法通过编译器强制执行。

现在,在Objective-C 2.0中, @protocol语法支持@optional关键字,将协议中的某些方法标记为可选。 因此,只要它实现了所有标记为@required的方法,你的类就符合协议。 编译器可以确定你的类是否实现了所有必需的方法,这是一个巨大的节省时间。 iPhone SDK独占地使用了Objective-C 2.0 @protocol语法,我想不出有什么好的理由不要在任何新的开发中使用它(除了需要在早期版本的Mac OS上运行的Mac OS X Cocoa应用程序X)。

任何人都可以解释Objective-C中的协议类别之间的区别吗? 你什么时候使用一个?


据我了解,协议有点像Java的接口。 协议声明方法,但是实现取决于每个类。 分类看起来像Ruby的mixin。 使用类别,您可以将方法添加到现有的类。 即使是内置的类。


协议是实现指定方法的契约。 任何符合协议的对象都同意为这些方法提供实现。 协议的一个很好的用法是为委托定义一组回调方法(委托人必须对所有方法作出响应)。

类别提供了通过向其添加方法(类或实例方法)来扩展当前对象的功能。 一个很好的用法是扩展NSString类来添加之前没有的功能,例如添加一个方法来创建一个将接收器转换为1337 5P34K的新字符串。

NSString *test = @"Leet speak";
NSString *leet = [test stringByConvertingToLeet];

一个协议允许你声明一个不限于任何特定的类或类别的方法列表。 协议中声明的方法可以采用任何类别/类别。 采用协议的类或类必须实现协议中声明的所有必需的方法。

一个类别允许你添加额外的方法到现有的类,但是他们不允许额外的实例变量。 类别添加的方法成为类类型的一部分。


来自SGKochan的“Objective-C编程”定义

分类:

类别为您提供了一种简单的方法,将类的定义模块化为相关方法的组或类别。 它还为您提供了一种简单的方法来扩展现有的类定义,甚至无需访问类的原始源代码,也无需创建子类。

协议:

协议是在类之间共享的方法列表。 协议中列出的方法没有相应的实现; 他们的意思是由其他人(如你)来实施。 协议提供了一种方法来定义一组与特定名称相关的方法。 通常将这些方法记录下来,以便您知道它们如何执行,以便您可以根据需要在自己的类定义中实现它们。 协议列出了一组方法,其中一些方法可以选择实现,另一些方法则需要实现。 如果您决定为特定协议实施所有必需的方法,则说您遵守或采用该协议。 您可以定义一个协议,其中所有方法都是可选的,或者是所有方法都是必需的。







objective-c-protocol