天天看点

OC语言--Protocol

一、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文件中,也可用定义在原来类中

*一般情况下,都定义在单独文件中;

*定义在原来类中的分类,只需要了解就可以。