1、类别的概念及作用
类别概念
Category有很多种翻译: 分类\ 类别\ 类目 (一般叫分类)
Category是OC特有的语法, 其他语言没有的语法(类似于C#语言中的”扩展方法”和”partial”关键字)
类别的作用
在不修改原有的类的基础上增加新的方法
一个庞大的类可以分模块开发
一个庞大的类可以由多个人来编写,更有利与团队合作
使用类别的目的
1)对现有类进行扩展:
比如,你可以扩展Cocoa touch框架中的类,你在类别中增加的方法会被子类所继承,而且在运行时跟其他 的方法没有区别。
2)作为子类的替代手段:不需要定义和使用一个子类,你可以通过类别直接向已有的类里增加方法。
3)对类中的方法归类:利用category把一个庞大的类划分为小块来分别进行开发,从而更好的对类中的方 法进行更新和维护.
2、使用类别的步骤
先声明类别--->实现类别--->使用类别
3、分类的声明和实现
分类:
一些方法的声明和实现
作用: 在不修改类的源代码的前提下,给类增加新的功能
使用步骤:
//此处是声明一个类
@interface Person : NSObject
@end
//类的实现
@implementation Person
@end
1) 声明一个分类
格式:
@interface待扩展的类名 (分类的名称)
@end
Person+base -->分类文件的命名规则
eat run
如:
@interface Person (base)
//吃
-(void)eat;
//跑
-(void)run;
@end
2) 实现这个分类
格式:
@implementation待扩展的类 (分类的名称)
@end
如:
Person+base类别实现
@implementation Person (base)
//吃
-(void)eat{
NSLog(@"人会吃东西");
}
//跑
-(void)run{
NSLog(@"人会跑")
}
@end
3) 使用分类中的方法
和使用类中原有的对象一样
Person *p = [Person new];
[p xxx];
playGame类别 ---张三
playlol playdota
study 类别 --- 李四
studyc studyios
创建一个Person类,声明和实现部分
<span style="font-size:18px;">#import <Foundation/Foundation.h>
@interface Person : NSObject
//person类原有的属性和方法
@end
//给Person类增加新的方法
// 声明一个分类
@interface Person (base)
//吃
-(void)eat;
//跑
-(void)run;
@end</span>
<span style="font-size:18px;">#import "Person.h"
//实现一个类别
@implementation Person (base)
//吃
-(void)eat{
NSLog(@"人会吃东西");
}
//跑
-(void)run{
NSLog(@"人会跑");
}
@end
@implementation Person
//类原有的方法的实现
@end</span>
声明一个分类(Person+study)声明和实现:
<span style="font-size:18px;">#import "Person.h"
@interface Person (study)
-(void)studyC;
-(void)studyIOS;
@end
</span>
<span style="font-size:18px;">#import "Person+study.h"
@implementation Person (study)
-(void)studyC{
NSLog(@"那人正在学习C语言");
}
-(void)studyIOS{
NSLog(@"那人正在学习IOS");
}
@end</span>
声明另一个分类(Peson+playGame),声明和实现:
<span style="font-size:18px;">#import "Person.h"
@interface Person (playGame)
//增加一个类别,类别名称 playGame 给Person增加新的方法
-(void)playLol;
-(void)playDota;
@end</span>
<span style="font-size:18px;">#import "Person+playGame.h"
@implementation Person (playGame)
-(void)playLol{
NSLog(@"那人正在玩撸啊撸");
}
-(void)playDota{
NSLog(@"那人正在玩刀塔");
}
@end</span>
实现分类中的方法:
<span style="font-size:18px;">#import <Foundation/Foundation.h>
#import "Person.h"
#import "Person+playGame.h" //分类的声明的头文件
#import "Person+study.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [Person new];
[p eat];
[p run];
[p playLol];
[p playDota];
[p studyC];
[p studyIOS];
}
return 0;
}</span>
结果:4、分类的使用注意事项:
1)分类只能增加方法,不能增加成员变量、@property(可能编译不报错,但是运行有问题)
2)分类可以访问原来类中的成员变量
4)分类的编译顺序最下面的是最后编译,当多个分类中有同名方法,则执行最后编译的文件方法
<span style="font-size:18px;">#import <Foundation/Foundation.h>
@interface Gun : NSObject
@end</span>
<span style="font-size:18px;">#import "Gun.h"
@implementation Gun
@end
</span>
创建一个人类声明并实现:
<span style="font-size:18px;">#import <Foundation/Foundation.h>
@interface Person : NSObject
@end
</span>
<span style="font-size:18px;">#import "Person.h"
@implementation Person
@end</span>
创建一个协议:
<span style="font-size:18px;">#import <Foundation/Foundation.h>
//这时一个类别
// 给NSObject类增加的
// 类别的名称 run
// 这是一个非正式协议
@interface NSObject (run)
-(void)eat;
-(void)run;
@end</span>
<span style="font-size:18px;">#import "NSObject+run.h"
@implementation NSObject (run)
-(void)eat{
NSLog(@"会吃东西");
}
-(void)run{
NSLog(@"会跑");
}
@end</span>
实现协议中的方法:
<span style="font-size:18px;">int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [Person new];
[p eat];
Gun *gun = [Gun new];
[gun eat];
[gun run];
}
return 0;
}</span>
6、类的延展
延展类别又称为扩展(Extendsion)
Extension是Category的一个特例其名字为匿名(为空),并且新添加的方法一定要予以实现。(Category没有这个限制)@interfaceStudent ()
@end
2、延展的实现
通过延展来实现方法的私有,延展的头文件独立。这种方法不能实现真正的方法私有,当在别的文件中引入延展的头文件,那么在这个文件中定义的类的对象就可以直接调用在延展中定义所谓私有的方法
//对类的延展 -隐藏方法 wrap的一种手段(非强制).h文件
@interface SceneManager ()
+ (void) wrap;
@end
.m类的实现文件中@implementation SceneManager+ (void) wrap {
NSLog(@"method of wrap");}
@end 想
<span style="font-size:18px;"><span style="font-size:18px;">
</span></span>
创建一个Person类别,声明部分:
<span style="font-size:18px;"><span style="font-size:18px;">#import <Foundation/Foundation.h>
@interface Person : NSObject
@property int age;
//setAge
//age
//_age
-(void)test;
@end</span></span>
创建一个Person的延展类:
<span style="font-size:18px;"><span style="font-size:18px;">#import "Person.h"
@interface Person ()
{
int _height;
}
-(void)work;
@end
</span></span>
实现类:
<span style="font-size:18px;"><span style="font-size:18px;">#import "Person.h"
#import "Person_work.h"
//扩展\延展\延展分类
//延展是一个特殊的分类
//特点:
// 1) 可以在延展中 定义实例变量
// 2) 不能使用 @implementation 类名() 实现类别的方法
// 3) 作用,可以定义私有的变量和方法
@interface Person ()
{
float _weight;
}
-(void)run; //run 相对私有的方法
@end
@implementation Person
-(void)run{
NSLog(@"延展的run方法 %.2f",_weight);
}
// Person_work.h 声明的,延展
-(void)work{
NSLog(@"work %d",_height);
}
-(void)test{
[self run];
[self work];
}
@end</span></span>