协议: 类似于c++的纯虚函数(java中的接口),
只有声明,没有实现, 你需要在子类中实现。
其中@optional 属性方法不要求必须实现。
@required属性 要求实现协议的类必须要实现方法。
如果不确定协议是否被实现,可以使用respondsToSelector:@select()来判断。
协议不是类,就是简单定义了一个其他对象可以实现的接口。
非正式协议:
是使用类别category来实现,他是nsobject的一个类别。这样任何类的对象都可以作为委托对象来使用。他可以列出对象能够执行的多种方法。这样用来实现委托我们可以使用选择器来判断非正式协议中是否有这个方法。
- @interface NSObject (***Delegate)
-
- @end
正式协议:一个命名方法列表。
与非正式的区别在于:他要求显示采用协议,采用协议的方法是在类的@interface声明中列出协议的名称。
这时实现协议的类应该遵守协议,承诺实现协议中的所有方法。
- @protocol NSCopying
- -(id) copyWithZone:(NSZone *) zone;
- @end
-
- @interface Car : NSObject<NSCopying>
- {
-
- }
-
- @end
cocoa china中的总结:
1.协议声明了可以被任何类实现的方法
2.协议不是类,它是定义了一个其他对象可以实现的接口
3.如果在某个类中实现了协议中的某个方法,也就是这个类实现了那个协议。
4.协议经常用来实现委托对象。一个委托对象是一种用来协同或者代表其他对象的特殊对象。
5:委托,就是调用自己定义方法,别的类来实现。
6.新特性说明
@optional预编译指令:表示可以选择实现的方法
@required预编译指令:表示必须强制实现的方法