类别---category

@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;

}



你可能感兴趣的:(类别---category)