标签:
interface是一个类的头文件的声明不是真正意义上的接口的意思。protocol才是OC的接口。
作用:
用来声明一些方法
也就是说,一个prtocol是由一系列方法声明组成的。
语法格式:
@protocol 协议名
//方法的声明列表
@end
@interface 类名 : 父类 <协议名称1, 协议名称2,…>
@end
Protocol和继承的区别:
协议的注意事项:
1、协议只能声明方法,不能声明属性。
2、父类遵守了某个协议,那么子类也会自动遵守协议。
3、OC中可以遵循多个协议,但是只能有一个父类。OC不能多继承,但是可以多层继承。
4、协议也可以遵守其他协议,然后有一个类遵守这个协议的话,就会具备所有协议的方法声明。
5、每个新的协议都遵守NSObject的协议(建议都遵循,不遵循也没关系)
protocol可以实现一些必须实现和选择实现的方法。这个和java是完全不同的。
@required和@optional关键字
@protocol SportProtocol <NSObject>
@required // 如果遵守协议的类不实现会报警告
- (void)playFootball;
@optional // 如果遵守协议的类不实现不会报警告
- (void)playBasketball;
@end
注意:@required和@optional仅仅使用程序员之间交流,
并不能严格的控制某一个遵守该协议的类必 须要实现该方法,
因为即便不是实现也不会报错, 只会报一个警告
协议的类型限制
3、虽然在接受一个对象的时候,对这个对象进行了类型限定(限定它必须实现某个协议),但并不意味着这个对象就真正的实现了该方法,所以每次在调用对象的协议方式应该进行一次验证。
wife这个类遵循了一个协议,并实现了需要的方法,然后在Person类中有一个wife对象属性,并在Person自己的方法中调用wife的属性[self.wife cooking],这里就需要验证wife的方法是否实现了协议的方法。(看下面的代码)
这么做也是用于程序员之间沟通的。这样可以使得第二个个程序员和第一个程序员开发的代码在协议上很好的发现需要遵循协议并需要实现的地方。
4、遵守协议,仅仅是具有协议中方法的声明,但是没有方法的实现,所有还需要具体的实现。
验证wife的方法是否实现了协议的方法。
if([self.wife respondsToSelector:@selector:(cooking)]){
[self.wife cooking];
}
if([self.wife respondsToSelector:@selector:(washing)]){
[self.wife washing];
}
if([self.wife respondsToSelector:@selector:(job)]){
[self.wife job];
}
协议的编写规范: 1.一般情况下, 当前协议属于谁, 我们就将协议定义到谁的头文件中 2.协议的名称一般以它属于的那个类的类名开头, 后面跟上protocol或者delegate 3.协议中的方法名称一般以协议的名称protocol之前的作为开头 4.一般情况下协议中的方法会将触发该协议的对象传递出去
5.一般情况下一个类中的代理属于的名称叫做 delegate
6.当某一个类要成为另外一个类的代理的时候, 一般情况下在.h中用@protocol 协议名称;告诉当前类 这是一个协议. 在.m中用#import真正的导入一个协议的声明
标签:
原文地址:http://www.cnblogs.com/goodboy-heyang/p/4966917.html