分类:
分类是给原有的类扩充一系列的方法,在不改变源代码的情况下给类添加 方法的简便方法,无需创建子类。
分类的一些注意事项:
1,分类不能添加成员变量,自能访问原始类的成员变量
2,分类可以重写原类的方法,但是这样做会导致原类的方法不能再使用
3,可以创建多个分类
4,分类声明的方法不必全都实现
5,通过分类添加方法会影响原类和其子类
原类:
#import <Foundation/Foundation.h>
@interface Fraction : NSObject
{
int numerator;
int denominator;
}
- (void)setTo:(int)a andOver:(int)b;
@end
通过分类的方法给Fraction添加加减乘除四个函数
#import <Foundation/Foundation.h>
//这里既有对分类接口部分的定义,也有对现有接口的扩展,所以必须包含#import "Foundation"
#import "Foundation"
//分类名称MathOps
@interface Fraction (MathOps)
- (Fraction *)add:(Fraction *)f;
- (Fraction *)sub:(Fraction *)f;
- (Fraction *)mul:(Fraction *)f;
- (Fraction *)div:(Fraction *)f;
@end
协议:
协议的声明类似于接口的声明,协议没有父类,不能自定义成员变量
一个协议的声明
@protocol Myprotocol <NSObject>
- (void)myProtocolMethod;
@end
协议是多个类共享的一个方法列表,协议中声明的方法都不用实现,
如果一个类要采用这个协议,那么必须实现,- (voidmyProtocolMethod方法
一个类采用的协议
@interface Fraction : NSObject <Myprotocol>
如果采用多个协议
@interface Fraction : NSOBject <Myprotocol,Otherprotocol>
注意:
1,如果一个类遵守了某个协议,那么它的子类也遵守这个协议
2,任何类都可以遵守某个协议
3,通过在类型名称之后的尖括号中添加协议名称,可以借助编译器的帮助来检查变量的一致性
id <Drawingprotocol> currentObject;
这是告诉编译器currentObject将包含遵守Drawingprotocol协议的对象。如果向currentObject指派静态类型的对想爱你个,这个对象不遵守Drawingprotocol协议,编译器将给出warning。
4,如果这个变量保存的对象遵守多个协议,则可以列出多项协议,如下
id <Drawingprotoco,Drawingprotocol1l> currentObject;
5,定义一项协议时,可以扩展现有的协议的定义,一下
@protocol Drawing3D <Drawing>
说明Drawing3D协议也采用了Drawing,因此采用Drawing3D协议的类都必须实现此协议流出的方法以及Drawing协议的方法
6,分类也可以采用一个协议
@interface Fraction(stuff) <NSCopying,NSCoding>
此处,Fraction拥有一个分类stuff,这个分类采用了NSCoping和NSCoding协议