Objective-C中正式和非正式协议有什么区别?

Objective-C中正式和非正式协议有什么区别?

从正式文件

正式和非正式协议

有两种协议,正式和非正式的:

  • 一个非正式的协议是一个关于NSObject的类别,它隐式地使得几乎所有对象都成为协议的采用者。 (一个类别是一种语言function,使您可以将方法添加到某个类中,而无需对其进行子类化。)在非正式协议中实现方法是可选的。 在调用方法之前,调用对象检查目标对象是否实现它。 在Objective-C 2.0中引入了可选协议方法之前,非正式协议对于Foundation和AppKit类实现委派的方式至关重要。

  • 一个正式的协议声明了一个客户类需要实现的方法列表。 正式协议有自己的声明,采用和types检查语法。 您可以使用@required和@optional关键字指定需要实现的方法或可选方法。 子类inheritance了其祖先采用的正式协议。 正式协议也可以采用其他协议。

正式的协议是对Objective-C语言的扩展。

非正式协议Category (实施是可选的)

正式协议Extension (实现是可选的并且是必需的)

Objective-C语言提供了一种方法来正式声明方法列表(包括声明的属性)作为协议。 语言和运行时系统支持正式的协议。 例如,编译器可以根据协议检查types,并且对象可以在运行时检查它们是否符合协议。