A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

一、分类(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文件内容】
  1. #import <Foundation/Foundation.h>
  2. #pragma mark Person 类声明部分
  3. @interface Person : NSObject{
  4.     int _age;
  5.     NSString *_name;
  6. }
  7. @property(nonatomic,assign) int age;
  8. @property(nonatomic,strong) NSString *name;
  9. -(void) eat;

  10. @end
复制代码


【Person+base.h文件内容】
  1. #pragma mark Person  分类声明部分

  2. @interface Person(base)

  3. //int sex;//这样会在编译时报错
  4. //@property int sex;//编译时不报错,但是使用sex时会报错(如p.sex = 1),找不到setSex方法

  5. //声明扩展的方法
  6. -(void) eat;

  7. -(void)run;
  8. @end
复制代码



【Person.m文件内容】
  1. #pragma mark Person  类实现部分
  2. @implementation Person
  3. -(void) eat{
  4.     NSLog(@"Person eat food....");
  5. }
  6. @end
复制代码

【Person+base.m文件内容】

  1. #pragma mark Person  分类实现部分
  2. @implementation Person(base)
  3. -(void)eat{
  4.     //分类中可以调用原类中的成员变量
  5.     NSLog(@"%@ eat food....",self.name);
  6. }

  7. -(void)run{
  8.     NSLog(@"%@ run....",self.name);
  9. }
  10. @end
复制代码


【main.m文件内容】
  1. #import "Person.h"
  2. #import "Person+base.h" //分类头文件也要引入
  3. int main(int argc, const char * argv[])
  4. {

  5.     @autoreleasepool {
  6.         Person *p = [Person new];
  7.         p.name = @"Amos";
  8.         //Person类对象可以调用分类中的方法,就跟调用原有类中的一样
  9.         [p run];
  10.         //Person类与其分类中有同名方法,优先调用分类中的方法
  11.         [p eat];

  12.     }
  13.     return 0;
  14. }
复制代码



【打印结果】
2015-10-07 09:54:09.439 加强02[616:303] Amos run....
2015-10-07 09:54:09.441 加强02[616:303] Amos eatfood....


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马