分类(类别)作用:扩展已有类的功能
1、分类是原来的类增加方法-----仅仅增加方法而已
2、在方法内部可以访问原有类的成员变量(定义.h头文件中)
如何增加一个分类操作步骤:右键点击New File->Objective-C.File->第一行输入名称,第二行选择Category,第三行选择需要扩展的类名。
注意点:
1、分类中不能扩展原有类的成员变量
2、@property在分类中只能生成getter setter方法的声明,不能生成实现和成员变量
分类可以扩充系统自带的类的功能
给NSObject增加分类会影响到所有的类,但是这个东西一定要谨慎小心
3、你不能在分类中定义与原有类同名方法,不同的分类之间也不可以有同名的方法
4、如果你再分类中增加一个原有类同名方法 ,那么分类中个方法会覆盖原有类的方法(哪怕你没有导入这个分类)
1、分类是原来的类增加方法-----仅仅增加方法而已
2、在方法内部可以访问原有类的成员变量(定义.h头文件中)
如何增加一个分类操作步骤:右键点击New File->Objective-C.File->第一行输入名称,第二行选择Category,第三行选择需要扩展的类名。
注意点:
1、分类中不能扩展原有类的成员变量
2、@property在分类中只能生成getter setter方法的声明,不能生成实现和成员变量
分类可以扩充系统自带的类的功能
给NSObject增加分类会影响到所有的类,但是这个东西一定要谨慎小心
3、你不能在分类中定义与原有类同名方法,不同的分类之间也不可以有同名的方法
4、如果你再分类中增加一个原有类同名方法 ,那么分类中个方法会覆盖原有类的方法(哪怕你没有导入这个分类)
5、多个分类中如果有相同方法,优先使用最后编译到的分类方法。(在目标标签页选择Build phases下的compile sources查看编译顺序。)
#import <Foundation/Foundation.h>//------main
#import "LSPerson+show.h"//导入分类.h文件
#import "LSPerson.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
LSPerson *per = [[LSPerson alloc] init];
per.name = @"龙叔叔";
[per say];
[per show];//可以使用分类的方法
}
return 0;
}
#import <Foundation/Foundation.h>//------LSPerson.h
@interface LSPerson : NSObject
{
@private
int _age;
}
@property(nonatomic,copy)NSString *name;
-(void) say;
@end
#import "LSPerson.h"//------LSPerson.m
@implementation LSPerson
-(void) say{
NSLog(@"%s",__func__);
}
@end
#import "LSPerson.h"//------LSPerson+Show.h
@interface LSPerson (Show)
{
// double _height;在分类中是不能增加成员变量的
}
//只能生成getter 与 setter方法的声明,不能生成方法的实现,更不会生成成员变量
//@property (nonatomic,assign) double height;
-(void) show;//增加一个show的方法
@end
#import "LSPerson+show.h"//------LSPerson+Show.m
@implementation LSPerson (Show)
-(void) show{
//在分类的内部可以访问原有类的成员变量(不是定义在.m文件中的)
//因为导入的头文件的私有成员变量事实上是在.m文件中,所以这边不能直接用_name;
//如果导入的头文件的变量名在.h文件中,就可以_age访问
_age = 28;
NSLog(@"age = %d,name = %@",_age,self.name);
}
@end