一、分类(Catgory)的概念及使用 1、分类的概念 在不改变原有类的情况下,给原有类添加方法 【Category】是OC特有的语法,其他语言没有。类似于C#中的扩展方法和partial关键字。 【实质】一些方法的声明和实现 2、作用 1)在不修改原有类的基础上增加新的方法 2)一个庞大的类可以分模块开发 3)一个庞大的类可以有多个人来编写,更利于团队合作
3、使用分类的目的 1)对现有类进行扩展
2)作为子类的替代手段 不需要定义和使用一个子类,可以通过类别直接想已有的类增加方法 3)对类中的方法归类 利用category把一个庞大的类划分为小块进行开发,从而更好的对类中的方法进行更新和维护。
4、使用分类的步骤 先声明分类-->实现分类--->使用分类 【注意】分类的命名规则:类名+扩展方法:如:“NSString+countNum” 分类的接口声明与类的定义十分相似,但分类不继承父类,只需要带有一个括号,表明该分类的主要用途。 【声明一个分类】 格式: @interface 待扩展类名 (分类名称) 【实现分类】 @implementation 待扩展类名 (分类名称) 【调用类别中的方法】 与一般成员方法调用形式完全一样。【需要包含类别的头文件】
二、分类(Category)使用注意事项 1、分类只能增加方法方法,不能增加成员变量 1)在分类中不能声明实例变量 2)也不能使用@property 2、分类可以访问原来类的成员变量 3、如果分类中方法与原类中方法同名,优先调用分类中方法 4、在多个类别中有同名的方法时,【执行最后编译的那个类别中的同名方法】 三、分类使用举例 【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 分类声明部分
-
- @interface Person(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....
|