interface是一个类的头文件的声明不是真正意义上的接口的意思。protocol才是oc的接口。
作用:
语法格式:
类遵守协议
一个类可以遵守1个或多个协议
任何类只要遵守了protocol,就相当于拥有了protocol的所有方法声明
protocol和继承的区别:
继承之后默认就有实现, 而protocol只有声明没有实现
相同类型的类可以使用继承, 但是不同类型的类只能使用protocol
protocol可以用于存储方法的声明, 可以将多个类中共同的方法抽取出来, 以后让这些类遵守协议即可
协议的注意事项:
protocol可以实现一些必须实现和选择实现的方法。这个和java是完全不同的。
@required和@optional关键字
协议中有2个关键字可以控制方法是否要实现(默认是@required,在大多数情况下,用途在于程序员之间的交流)
@required:这个方法必须要实现(若不实现,编译器会发出警告)
@optional:这个方法不一定要实现
协议的类型限制
1、协议的第一个应用场景,可以将协议写在数据类型的右边,明确的标注如果想给该变量赋值,那么该对象必须遵守某个协议。
2、注意:类型限定是写在数据类型的右边的。(有点类似java中的范型)。
3、虽然在接受一个对象的时候,对这个对象进行了类型限定(限定它必须实现某个协议),但并不意味着这个对象就真正的实现了该方法,所以每次在调用对象的协议方式应该进行一次验证。
可以使用"respondstoselector:@selector(方法名)"对 这个遵循协议的对象的方法在被调用的时候进行安全验证 例如:
wife这个类遵循了一个协议,并实现了需要的方法,然后在person类中有一个wife对象属性,并在person自己的方法中调用wife的属性[self.wife cooking],这里就需要验证wife的方法是否实现了协议的方法。(看下面的代码)
这么做也是用于程序员之间沟通的。这样可以使得第二个个程序员和第一个程序员开发的代码在协议上很好的发现需要遵循协议并需要实现的地方。
4、遵守协议,仅仅是具有协议中方法的声明,但是没有方法的实现,所有还需要具体的实现。
协议的编写规范: 1.一般情况下, 当前协议属于谁, 我们就将协议定义到谁的头文件中 2.协议的名称一般以它属于的那个类的类名开头, 后面跟上protocol或者delegate 3.协议中的方法名称一般以协议的名称protocol之前的作为开头 4.一般情况下协议中的方法会将触发该协议的对象传递出去
5.一般情况下一个类中的代理属于的名称叫做 delegate
6.当某一个类要成为另外一个类的代理的时候, 一般情况下在.h中用@protocol 协议名称;告诉当前类 这是一个协议. 在.m中用#import真正的导入一个协议的声明