协议(Protocol)
**
一、
因为Objective-C是不支持多继承的,所以很多时候都是用Protocol来代替。Protocol只能定义公用的一套接口,但不能提供具体的实现方法。即它只告诉你要做什么,但具体怎么做,它不关心。
和类的声明很相似,不仅可以声明方法,也可以声明属性
property
,但是不能定义成员变量。//属性包含了三样东西:成员变量、
setter
方法、getter
方法在类中定义的属性上述三者都有,在协议中定义的属性只有获取和设置方法,没有成员变量,这就要求该协议的遵守者必须自己写出
setter
和getter
方法的实现。但是有一种情况是不需要的,那就是遵守者本来就有这个属性,此时系统会为这个属性自动生成设置获取方法。
协议也能继承。既可以继承自定义的协议,也可以继承系统的协议。
在定义协议的时候一般都直接继承自
<NSObject>
。因为这个协议中定义了一些基本的方法,由于我们使用的所有类都继承
NSObject
这个基类,
而这个基类遵守了<NSObject>
这个协议,也就实现了其中的那些方法,这些方法可以由NSObject
及其子类对象调用,
但是在不知道遵守者类型的时候需要用到id <协议名>
这样的指针,这个指针在编译期并不知道自己指向哪个对象,唯一能调用的便是协议中的方法,然而有时候又需要用一些基本的方法,比如要辨别id <协议名>
这个指针所指的对象属于哪个类,就要用到-isMemberOf:
这个方法,而这个方法是<NSObject>
这个协议中的方法之一,所以,我们自定义的协议都需要继承
<NSObject>
。
@protocol Locking <NSObject>
@optional
- (void)lock;
@required //默认
- (void)unlock;
@end
二、protocol 可以写在哪
- 写在头文件中:
可以当做是给这个类添加了一些外部接口。类内部通过self
调用,外部也可以调用里面的方法,子类可以实现或者重写里面的方法。- 写在实现文件的类扩展中:
可以当做是给这个类添加了一些私有接口。在类扩展中,内部可以调用,外部不能调用、子类不能重写实现和重写,相当于是私有方法。
三、protocol 里的方法由谁实现,由谁调用
实现:遵守协议者及其子类
调用:遵守协议者、子类、
id <协议名>
四、protocol 有哪些作用,用在哪些地方
- 某一个类需要委托其他类处理某件事件,最具代表性的便是UITableView的那些代理方法。
可以:将委托者中的数据传递给代理;将代理的数据传递给委托者;将委托者的事件抛给代理去处理…- 给某几个特定的类添加统一的接口,这些接口是从这些类中抽象出的共同的行为,这样便可以减少重复的代码。