1. 协议的定义:
》协议就是用来声明一大堆方法的。
@protocol 协议名称 <NSObject>
// 方法声明列表..........
@end
2. 如何遵守协议 :
》类遵守协议,本类就会拥有它遵守的协议所有的方法:
@interface 类名 : 父类名 <协议名称1 ,协议名称2 , .... >
............. // 类的声明
@end
》协议遵守协议,本协议就会拥有其他协议所有的方法:
@protocol 协议名称 <其他协议名称1 , 其他协议名称2,.....>
// 本协议的方法声明,
@end
3. 协议中方法声明的关键字:
》@required (默认) ,要求实现,如果没有实现,会发出警告。
例如,在协议体中: @required
- (void) text() ;
》@optional ,不要求实现,不管在遵守该协议的类中实不实现,都不会发出警告。
4.定义一个变量的时候,限制这个变量保存的对象遵守某个协议:
》形式:类名<协议名称> * 变量名;
id <协议名称> 变量名;
》例如:NSObject<MyProtocol> * obj ;
id <MyProtocol> obj2 ;
注意:如果指向的对象没有遵守对应的协议,编译器会有警告:等式右边的对象会有一个黄色的下划线。
5. @property 中声明的属性也可以用做一个遵守协议的限制:
》形式: @property (nonatomic , strong) 类名<协议名称> * 成员变量名;
@property (nonatomic , strong) id<协议名称> * 成员变量名;
》例如:@property (nonatomic , strong) Person<MyProtocol> * person;
@property (nonatomic , strong) id<MyProtocol> * person2;
6.协议可以在单独 .h 文件中,也可以在某个类中:
》如果这个协议只用在某个类中,应该把协议定义在该类中;
》如果这个协议用在很多类中,就应该定义在单独文件中。
7.分类可用定义在单独 .h 和 .m 文件中,也可以定义在原来类中:
》分类:用来扩充一个类的功能。
》分类作用:对于一个类想要扩充,如果用继承,那么耦合性太强。那么就可以用分类来扩充功能。
》分类声明形式的例子:@interface Person (other) //对于Person这个类进行扩充功能
......... // 声明体
@end
》写分类的注意点:
(1)分类中不能定义成员变量,分类中可以调用被扩充的类中的私有成员变量(不能是编译器生成的,即用@property生成的)
(2)分类中如果声明和实现了和被扩充类中的方法一样,那么被扩充类中的同名方法会被覆盖。
(3)调用分类中的方法:创建一个被扩充类的对象p,用p对象直接调用分类中的方法。
》一般情况下,都是定义在单独文件中;
》定义在原来类中的分类,只要看懂即可。