美文网首页
iOS Category的理解

iOS Category的理解

作者: 乡下秋草 | 来源:发表于2017-04-10 17:52 被阅读50次

    1.什么是Category?

    category是Objective-C 2.0之后添加的语言特性,别人口中的分类、类别其实都是指的category。category的主要作用是为已经存在的类添加方法。除此之外,apple还推荐了category的另外两个使用场景。
    可以把类的实现分开在几个不同的文件里面。这样做有几个显而易见的好处:

    • 可以减少单个文件的体积
    • 可以把不同的功能组织到不同的category里
    • 可以由多个开发者共同完成一个类
    • 可以按需加载想要的category
    • 声明私有方法

    2.特点

    • category只能给某个已有的类扩充方法,不能扩充成员变量。category中也可以添加属性,只不过@property只会生成setter和getter的声明,不会生成setter和getter的实现以及成员变量。
    • 如果category中的方法和类中原有方法同名,运行时会优先调用category中的方法。
    • 如果多个category中存在同名的方法,运行时到底调用哪个方法由编译器决定,最后一个参与编译的方法会被调用。

    3.代码

    Animal 类

    #import <Foundation/Foundation.h>
    @interface Animal : NSObject
    - (void)logName;
    @end
    
    
    
    #import "Animal.h"
    @implementation Animal
    - (void)logName{
        NSLog(@"this is animal");
    }
    @end
    

    Person

    #import <Foundation/Foundation.h>
    #import "Animal.h"
    @interface Animal (Person)
    - (void)getPersonName;
    - (void)eat;
    @end
    
    #import "Animal+Person.h"
    
    @implementation Animal (Person)
    
    - (void)eat{
        
        NSLog(@"person eat");
    }
    
    - (void)getPersonName{
        
        NSLog(@"this is a person");
    }
    @end
    

    Cat

    #import <Foundation/Foundation.h>
    #import "Animal.h"
    
    @interface Animal (Cat)
    - (void)getCatName;
    
    - (void)eat;
    
    - (void)logName;
    @end
    
    @implementation Animal (Cat)
    - (void)eat{
        
        NSLog(@"cat eat");
    }
    
    - (void)getCatName{
        
        NSLog(@"this is a cat");
    }
    
    - (void)logName{
        NSLog(@"this is cat");
        
    }
    

    Demo

        Animal *a = [[Animal alloc]init];
        [a getCatName];
        [a getPersonName];
        [a logName];//证明优先实现分类中的方法
        [a eat];//根据编译的顺序,后边的会覆盖前边的
    

    打印结果

    2017-04-10 17:42:38.281 TestProject[5029:810107] this is a cat
    2017-04-10 17:42:38.282 TestProject[5029:810107] this is a person
    2017-04-10 17:42:38.282 TestProject[5029:810107] this is animal
    2017-04-10 17:42:38.282 TestProject[5029:810107] this is cat
    2017-04-10 17:42:38.282 TestProject[5029:810107] person eat
    

    两个类别的编译顺序改变后,输入也将改变


    F3DFE1DF-2A91-463E-9483-10A268E77C0C.png

    相关文章

      网友评论

          本文标题:iOS Category的理解

          本文链接:https://www.haomeiwen.com/subject/lpteattx.html