美文网首页
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