1. 分类(Category)
分类的作用
- 在不修改原有类的基础上增加新方法
- 一个庞大的类可以分模块开发
- 一个庞大的类可以由多个人来写,有利于团队合作
分类的目的
- 在不修改原有类的基础上增加新的方法,对原有类进行扩展,并且在category中增加的方法可以被子类继承
- 作为子类的替代手段,OC中的继承是单继承,一个类不能继承多个父类,可以通过类别向已有的类里增加方法
- 对类中的方法进行分类,利用category把一个庞大的类划分为小块来分别进行开发,可以从而对类中的方法进行更新和维护
分类的使用步骤:声明分类——实现分类——使用分类
分类的声明:
@interface 待扩展的类名 (分类的名称)
//方法的声明
@end
eg: @interface Person (base)
-(void)eat;
@end
分类的实现:
@implementation 待扩展的类名 (分类的名称)
//方法的实现
@end
eg:@implementation Person (base)
-(void)eat{
NSLog(@"xxxxxxxxxxx");
}
Category使用示例代码如下:
//声明一个分类
#import "Person.h"
@interface Person (base)
//分类中方法的声明
-(void)eat;
-(void)run;
@end
//分类的实现
#import "Person+base.h"
@implementation Person (base)
//分类中方法的实现
-(void)eat{
NSLog(@"人正在吃饭");
}
-(void)run{
NSLog(@"人正在跑步");
}
@end
//使用分类中的方法
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p=[Person new];
//调用分类中的方法
[p eat];
[p run];
}
return 0;
}
分类使用注意事项:
分类只能增加方法,不能增加成员变量,也不能使用@property
可以在分类中访问原来的成员变量
分类和原来类方法同名时,会覆盖类中同名的方法
在多个类别中有同名方法时,执行的是最后编译的那个类别的同名方法
分类和继承的区别:
分类不能扩展属性,而继承可以
必须要使用继承的两种情况:
a. 需要扩展的方法和原方法同名时,并且需要调用原来类中的同名方法时,只能使用继承,而不能使用分类,否则分类会覆盖原方法的实现,访问不到原方法。
b. 扩展属性时只能使用继承
非正式协议:
非正式协议是类别,是给Foundation框架中NSObject类或其子类建立的类别。
延展(Extension)
Extension是分类的一个特例,是匿名的分类。
Extension和Category的区别:
a. Extension中可以定义实例变量,而分类不可以
b. Extension中定义的方法必须实现,而分类不做要求
c. Extension没有独立的实现部分,延展声明方法的实现必须在对应类的实现文件中实现
延展实现方法的相对私有化。但是当别的头文件引入延展的头文件时,在这个文件中定义的类对象就可以直接调用在延展中定义的私有方法。
延展的示例代码如下:
//延展的头文件
#import "Person.h"
@interface Person ()
@property (nonatomic,assign) int weight;
-(void)work;
@end
//在对应类的实现文件中实现延展中声明的方法
#import "Person.h"
#import "Person_work.h"
@implementation Person
-(void)work{
Person *p=[Person new];
p.weight=100;
NSLog(@"weight=%d的人正在工作",p.weight);
}
-(void)test{
//用self调用私有方法
[self work];
}
@end
//使用延展中的方法
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p=[Person new];
//通过调用类对外公开的方法,使用私有方法
[p test];
}
return 0;
}