1、类别接口语法格式
@interface 已有类 (类别名)
//定义方法
....
@end
2、类别实现部分语法格式
@implementation 已有类 (类别名)
//方法实现
....
@end
3、实例
为NSNumber添加一个类别
1)NSNumber+fk.h
#import <Foundation/Foundation.h>
// 定义一个类别
@interface NSNumber (fk)
// 在类别中定义4个方法
- (NSNumber*) add: (double) num2;
- (NSNumber*) substract: (double) num2;
- (NSNumber*) multiply: (double) num2;
- (NSNumber*) divide: (double) num2;
@end
2)NSNumber+fk.m
#import "NSNumber+fk.h"
// 为类别提供实现部分
@implementation NSNumber (fk)
// 实现类别的接口部分定义的4个方法
- (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
3)使用
#import <Foundation/Foundation.h>
#import "NSNumber+fk.h"
int main(int argc , char * argv[])
{
@autoreleasepool{
NSNumber* myNum = [NSNumber numberWithInt: 3];
// 测试add:方法
NSNumber* add = [myNum add:2.4];
NSLog(@"%@" , add);
// 测试substract:方法
NSNumber* substract = [myNum substract:2.4];
NSLog(@"%@" , substract);
// 测试multiply:方法
NSNumber* multiply = [myNum multiply:2.4];
NSLog(@"%@" , multiply);
// 测试divide:方法
NSNumber* divide = [myNum divide:2.4];
NSLog(@"%@" , divide);
}
}
类别说明:
- 通过类别为指定类添加新方法之后,父类和子类都拥有新添加的类别方法
- 可根据需求为一个类定义多个类别,不同的类别可对原有的类增加方法定义
- 利用类别对类进行模块化设计,比如NSWindow类,它包含几百个方法,但是根据功能的划分,分别放在不同的类别中实现
- 使用类别来调用私有方法
- 使用类别来实现非正式协议
4、使用类别调用私有方法
没有在接口中定义而是直接在类实现部分定义的方法相当于私有方法,通常不允许被调用。但是可以通过NSObject的performSelector:方法执行动态调用,但是避开了编译器的检查,并不太好。此外,还可以通过类别定义前向引用,从而实现私有方法的调用,如下代码:
1)FKItem.h
#import <Foundation/Foundation.h>
// 定义类的接口部分
@interface FKItem : NSObject
@property (nonatomic , assign) double price;
- (void) info;
@end
2、FKItem.m
#import "FKItem.h"
// 为FKItem提供实现部分
@implementation FKItem
@synthesize price;
// 实现接口部分定义的方法
- (void) info
{
NSLog(@"这是一个普通的方法");
}
// 额外新增的方法
- (double) calDiscount:(double) discount
{
return self.price * discount;
}
@end
3、错误使用
#import <Foundation/Foundation.h>
#import "FKItem.h"
int main(int argc , char * argv[])
{
@autoreleasepool{
FKItem* item = [[FKItem alloc] init];
item.price = 109;
[item info];
NSLog(@"物品打折的价格为:%g" , [item calDiscount:.75]);//调用私有方法,报错
}
}
使用类别修正
#import <Foundation/Foundation.h>
#import "FKItem.h"
// 为FKItem定义一个类别,前向声明
@interface FKItem (fk)
// 在类别中前向声明calDiscount:方法
- (double) calDiscount:(double)discount;
@end
int main(int argc , char * argv[])
{
@autoreleasepool{
FKItem* item = [[FKItem alloc] init];
item.price = 109;
[item info];
NSLog(@"物品打折的价格为:%g" , [item calDiscount:.75]);
}
}