1、分类的概念
在不改变原有类的情况下,给原有类添加方法
【Category】是OC特有的语法,其他语言没有。类似于C#中的扩展方法和partial关键字。
【实质】一些方法的声明和实现
2、作用
1)在不修改原有类的基础上增加新的方法
2)一个庞大的类可以分模块开发
3)一个庞大的类可以有多个人来编写,更利于团队合作
3、使用分类的目的
1)对现有类进行扩展
2)作为子类的替代手段
不需要定义和使用一个子类,可以通过类别直接想已有的类增加方法
3)对类中的方法归类
利用category把一个庞大的类划分为小块进行开发,从而更好的对类中的方法进行更新和维护。
4、使用分类的步骤
先声明分类-->实现分类--->使用分类
【注意】分类的命名规则:类名+扩展方法:如:“NSString+countNum”
分类的接口声明与类的定义十分相似,但分类不继承父类,只需要带有一个括号,表明该分类的主要用途。
【声明一个分类】
格式:
@interface 待扩展类名 (分类名称)
【实现分类】
@implementation 待扩展类名 (分类名称)
【调用类别中的方法】
与一般成员方法调用形式完全一样。【需要包含类别的头文件】
5、使用注意事项
1、分类只能增加方法方法,不能增加成员变量
1)在分类中不能声明实例变量
2)也不能使用@property
2、分类可以访问原来类的成员变量
3、如果分类中方法与原类中方法同名,优先调用分类中方法
4、在多个类别中有同名的方法时,【执行最后编译的那个类别中的同名方法】
6、分类使用举例
【Person.h文件内容】
#import <Foundation/Foundation.h>
#pragma mark Person 类声明部分
@interface Person : NSObject{
int _age;
NSString *_name;
}
@property(nonatomic,assign) int age;
@property(nonatomic,strong) NSString *name;
-(void) eat;
@end
【Person+base.h文件内容】
#pragma mark Person 分类声明部分
@interfacePerson(base)
//int sex;//这样会在编译时报错
//@property int sex;//编译时不报错,但是使用sex时会报错(如p.sex = 1),找不到setSex方法
//声明扩展的方法
-(void) eat;
-(void)run;
@end
【Person.m文件内容】
#pragma mark Person 类实现部分
@implementation Person
-(void) eat{
NSLog(@"Person eat food....");
}
@end
【Person+base.m文件内容】
#pragma mark Person 分类实现部分
@implementation Person(base)
-(void)eat{
//分类中可以调用原类中的成员变量
NSLog(@"%@ eat food....",self.name);
}
-(void)run{
NSLog(@"%@ run....",self.name);
}
@end
【main.m文件内容】
#import "Person.h"
#import "Person+base.h" //分类头文件也要引入
int main(int argc, const char * argv[])
{
@autoreleasepool {
Person *p = [Person new];
p.name = @"Amos";
//Person类对象可以调用分类中的方法,就跟调用原有类中的一样
[p run];
//Person类与其分类中有同名方法,优先调用分类中的方法
[p eat];
}
return 0;
}
【打印结果】
2015-10-07 09:54:09.439 加强02[616:303] Amos run....
2015-10-07 09:54:09.441 加强02[616:303] Amos eatfood....