协议:
- 协议不是一个类:它只能声明方法而不能有任何实例变量,它有两种类型:正式协议和非正式协议,并且协议只有声明文件,没有实现文件。正式协议是方法的集合,遵循了正式协议的类中必须要实现协议中的所有方法,一个类可以遵循的协议数量没有限制。非正式协议也是一系列方法的集合,但是遵循非正式协议中的类中可以根据自己的需要选择实现协议中的方法,即非正式协议中的方法可以不实现。
- 声明一个协议的一般格式:
@protocol protocolName<protocol,…>
requiredMethodDeclarations //默认是被@required修饰
@optional
optionalMethodDeclarations
@required
requiredMethodDeclarations
@end
- 被@optional修饰的方法是可以选择实现的,而被@required修饰的方法是必须要实现的。
- 协议通常是不与任何类有特定的关联,只是为所有的类提供了一个公有的接口。
- 协议定义没有对应的实现部分,在遵循协议的类中实现协议中的方法,如果类遵循了多个协议,协议之间用,隔开,实现的协议中的方法是可以继承的。(当某个类遵循了某些协议之后,就相当于该类拥有了这些协议中的方法)
- 如果让类遵循NSCopying协议,则声明文件如下:
@interface XYPoint:NSObject<NSCopying>
- copyWithZone:方法实现:
–(id)copyWithZone:(NSZone *)zone //NSCopying协议中的正式方法
{
XYPoint *newPoint =[[XYPoint allocWithZone:zone] init];
[newPoint setX:x andY:y];//将旧对象的实例变量拷贝到新对象中
//x和y:是要拷贝的旧对象的实例变量
return newPoint;
}
分类试用范围:
- 1.当你已经封装好了一个类,不想改动它,可是随着程序功能的增加,需要在类中增加1个方法,这时候没必要修改主类,只需要给原来的类增加一个分类。
- 2.将一个大型的类拆分成不同的分类,在不同的分类中实现声明的方法,这样可以将一个类的实现写到多个.m文件中,方便管理和协同开发。
分类中只能添加方法,不能添加实例变量。
分类中方法的优先级比原来类中的方法高。