一、protocol
协议的基本用途:
*声明方法,可以声明一大堆的方法,但不能声明成员变量;
*只要一个类遵守了谋一份协议,就能拥有这份协议中所有的声明;
*只要父类遵守了某个协议,则子类也相当于遵守了该协议。
二、协议格式:
@protocol 协议名称 方法声明列表 @end @property myProtocol - (void)test; @end
三、类的协议格式:
@interface 类名:父类 <协议名称> //... @end @interface Student : Person <myProtocol> //遵守协议后Student中就有了test方法,在Student的实现中需要将此方法实现 @end @implementation Student - (void)test { NSSlog(@"遵守了myProtocol协议"); } @end
四、@protocol关键字
*required:要求声明的方法必须实现
*optional:声明的方法不要求实现
关键字的书写是为了程序员之间的交流
五、多个协议
@property 协议名称 <协议名称1,协议名称2> @end @property myProtocol <protocol1, protocol2> @end
六、遵守协议
1、定义一个变量的时候,限制这个变量保存的对象遵守某个协议
类名<协议名称> *变量名;
id<协议名称> 变量名; NSObject<myProtocol> *obj; id<myProtocol> obj1;
如果没有遵守对应的协议,编译器会警告,此时的警告为整条语句的黄色下划线
2、@property中声明的属性也可用做一个遵守协议的限制
@property (nonatomic, strong) 类名<协议名称> *属性名;
@property (nonatomic, strong) id<协议名称> 属性名;
@property (nonatomic, strong) Dog<myProtocol> *dog;
@property (nonatomic, strong) id<myProtocol> dog2;
七、协议位置:
*协议可定义在单独的.h文件中,也可以定义在某个类中;
*如果这个协议只用在某个类中,则应该把协议写在该类的.h文件中;
*如果这个协议可以被多个类使用,则应该把协议写在单独的.h文件中;
八、分类位置:
*分类跟协议一样,也可以定义在单独的.h和.m文件中,也可用定义在原来类中
*一般情况下,都定义在单独文件中;
*定义在原来类中的分类,只需要了解就可以。