@interface 已有类(类别名)
//方法定义
@end
定义类名时使用的类名必须是该项目中没有的类,而定义类别时使用的类名必须是已有的类。
定义类别时必须使用圆括号来包含类别名
类别中通常指定义方法
@implmentation 已有类(类别名)
//方法实现
@end
例子:
@interface NSNumber (fk)
-(NSNumber*) add:(double) num2;
-(NSNumber*) substract:(double) num2;
-(NSNumber*) multiply:(double) num2;
-(NSNumber*) divide:(double) num2;
@end
#import "NSNumber+fk.h"
@implementation NSNumber(fk)
-(NSNumber*) add:(double) num2{
return [NSNumber numberWithDouble:([self doubleValue]+num2)];
};
-(NSNumber*) substract:(double) num2{
return [NSNumber numberWithDouble:([self doubleValue]+num2)];
];
-(NSNumber*) multiply:(double) num2{
return [NSNumber numberWithDouble:([self doubleValue]+num2)];
};
-(NSNumber*) divide:(double) num2{
return [NSNumber numberWithDouble:([self doubleValue]+num2)];];
@end
#import <Foundation/Foundation.h>
#import "NSNumbei+fk.h"
int main(int arg,char* argb[]){
@autoreleasepool{
NSNumber* num=[NSNumber numberWithInt: 3];
//至此 这个num对象可以调用添加的add/substract等方法。由于浮点数在底层存储时存在精度丢失问题,所以输出结果可能会存在差异。
}
return 0;
}
注意:在类别中也可以重写原有类的方法。
通过类别为指定类添加新方法后,这个新方法不但会影响NSNumber本身,还会影响NSNumber类的所有子类,每个子类都会获取到类别扩展的方法。
可根据实际需要给一个类定义多个类别,不同的类别都可以对原有类增加方法定义。
利用类别可以对类进行模块化设计
利用类别可以调用私有方法
利用类别可以实现非正式协议
关于扩展:
@interface NSWindow(NSKeyboardUI)
@interface NSWindow(NSToolbarSupport)
@interface NSWindow(NSDrag)
关于调用私有方法
在类实现部分写入接口部分没有的方法时,数实例化的对象并不能调用该方法,若想使用该方法,则需要使用类别,如下
@import <Foundation/Foundation.h>
@interface Item: NSObject
@property (nonatomic,assign) double price;
-(void) info;
@end
#import "Item.h"
@implementation Item
@synthesize price;
-(void) info{
//方法体
}
-(double) discount:(double) count{
return self.price*count;
}
#import <Foundation/Foundation.h>
#import "Item.h"
int main(int arg,char* argv[]){
@autoreleasepool{
Item item=[[Item alloc] init];
//在此不能调用[item disount:2]方法。
}
return 0;
}
若果需要访问该方法
则需要声明一个类别 该类别中具有discount方法
@interface Item(fk)
-(double) discount:(double) count;
@end
#import <Foundation/Foundation.h>
#import "Item+fk.h"
int main(int arg,char* argv[]){
@autoreleasepool{
Item item=[[Item alloc] init];
在此就可以调用[item disount:2]方法。
}
return 0;
}