黑马程序员技术交流社区

标题: OC学习笔记之分类 [打印本页]

作者: zhuhoulin    时间: 2015-7-23 20:41
标题: OC学习笔记之分类
分类(Category)的作用
    在不修改原有的类的基础上增加新的方法
    一个庞大的类可以分模块开发
    一个庞大的类可以有多个人来编写,更有利于团队合作


使用分类的目的
    1. 对现有的类进行扩展。
         比如可以扩展Cocoa touch框架中的类,这些新增加的类跟框架中的类没有区别。
    2.作为子类的替代手段
        不需要定义和使用一个子类,你可以通过类别直接向已有的类里增加方法
    3.对类中的方法进行归类
        利用Category把一个庞大的类划分为小块来分别进行开发,从而更好的对类中的方法进行更新和维护。


使用分类的步骤
     声明分类------------>实现分类----------->使用分类
     分类不能继承父类的方法



分类的声明和实现,及分类的使用
     1.声明
        格式:
                @interface 待扩展的类名 (分类的名称)
                @end
         例如:
                @interface Person :NSObject
                @end
                @interface Person (base)//给Person类增加方法
                             -(void)run;
                             -(void)eat;
                @end
      2.实现
          格式:   
                @implementation 待扩展的类 (分类的名称)
                @en待
           实现:
                 @implementation Person (base)
                             -(void)run{
                                      NSLog(@"人会跑");
                              }
                             -(void)eat{
           NSLog(@"人会吃饭");
         ·     }
                @end
        3.使用
               Person *p = [Person new];
                [p run];
                [p eat];


分类(Category)的使用座椅事项
     1.分类的使用注意事项
         (1)分类只能增加方法,不能增加成员变量(声明的时候不能够声明实例变量)
             如果使用@property声明的话,例如@property int sex;使用@property关键字的时候
             编译会通过,但是运行的时候会出错。
         (2)可以在分类中可以访问原有类的成员变量
         (3)如果分类和原来的类中存在相同名称的方法的话,那么优先使用分类中的方法
              注:类和分类在同一个源文件中
         (4)当多个类别中存在相同的方法的时候,程序运行时最后编译的的源文件中的方法会被执行
             修改编译顺序



分类(Category)的非正式协议
     所谓的非正式协议就是类别,这些类别是给NSObjectl或者foundation框架中提供的
             其子类增加新的方法,这些新方法所属的分类就是分正式协议。
     但是一般这些非正式协议不建议给NSObject。
     unichar ch = [characterAtIndex:0]//characterAtIndex方法是去当前位置的字符,返回类型是unichar类型。



分类(Category)的延展
     1.延展的概念和形式
        延展类别又称为扩展(延展,延展类别,扩展)-----------Extendsion是一个特例。形式体现:
        @interface Myclass (){      //这种写法的了别叫做匿名类别,又叫做类扩展,所谓的扩展,其实就是为一个类别
                                                 //添加额外的原来的没有的变量、方法、或者合成属性。
                float value;
         }
         -(void)setValue:(float)newValue;
         @end

      2.延展的实现
         @interface Person{
         }
         @end

         @interface Person (){
                   int _weight;//可以声明实例变量
         }
                   -(void)run;//相对私有的方法,方法声明的时候在延展分类中声明,但是方法实现的时候要通过源类声明
         @end
         @implementation
                   -(void)run{
                           NSLog(@"人在跑");//延展分类中申明的方法只能在原来中实现。
                   }
         @end








作者: ylxkab    时间: 2015-7-23 21:16
写了那么多,不错
作者: 花漾    时间: 2015-7-23 22:08
也是够认真的
作者: venn    时间: 2015-7-23 22:22
顶一个,,,,,,,提前预习了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2