IOS开发-ObjC-Category的使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IOS开发-ObjC-Category的使用相关的知识,希望对你有一定的参考价值。

ios移动App开发中,经常会出现以下情况:定义好了一个类,但后来需求升级或改变之后需要对这个类增加功能,这样的话往往需要修改类的结构,这样就会导致不能预期的问题产生,所以Obj-C提供了一种叫做Category的方法来对类进行扩展,在不改变原有类结构的基础上增加新的功能。具体的使用方法如下文。     

假设我们现在有一个类叫做Person类,继承自NSobject,Person类目前有一个功能就是改变Person实体对象的年龄函数,叫做changeAge,具体的声明和实现如下:          

1.类Person的声明: 

 

//  Person.h
#import <Foundation/Foundation.h>

@interface Person : NSObject
-(void)changeAge;
@end

             

2.类Person的实现   

 

//  Person.m
#import "Person.h"

@implementation Person
-(void)changeAge
{
    Nslog(@"Person类的年龄改变了");
}
@end

  

一开始我们的规划中,Person类中只需要一个功能也就是changeAge,后来考虑到Person年龄会随着时间而改变(需求变化)导致我们需要增加一个功能,当年份增加的时候,Age也要对应加1,这样我们就需要增加一个ageAutoChange的方法,按照文章开头的说法,使用category可以在不改变原有类的基础上增加类的方法,具体做法如下:

1)点击新建文件,在弹出的对话框中选择Objective-C File,然后下一步,在弹出的对话框中会有三个输入框,第一个是File:这个后面填你要增加的方法的文件名,我这里填入autoage,第二个是File Type:这个里面下拉选择Category,然后第三个Class,也就是要扩展的类名,我这里下拉选择Person,然后点击Next保存,就完成了扩展类的新建;

2)完成第一步之后会多出两个文件,分别是Person+Person_Autoage.h和Person+Person_Autoage.m,然后在Person+Person_Autoage.h中编辑如下:

//  Person+Person_autoAge.h

#import "Person.h"

@interface Person (Person_autoAge)
-(void)autoChangeAge;
@end

在Person+Person_Autoage.m中编辑如下:

//  Person+Person_autoAge.m

#import "Person+Person_autoAge.h"

@implementation Person (Person_autoAge)
-(void)autoChangeAge
{
    NSLog(@"Person的年龄增加1岁了");
}
@end

这样就完成了新功能的增加(在不该变原来类的定义的基础上)

接下来我们要在主函数里调用这两个方法,以验证我们的理解是否有偏差:

//  main.m

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Person+Person_autoAge.h"

int main(int argc, const char * argv[]) {
    {
        Person * p1=[[Person alloc] init];
        [p1 changeAge];
        [p1 autoChangeAge];
    }
    return 0;
}

完成之后点击运行,命令行中出现如下:

2016-02-20 15:48:23.310 studyCategory[652:8132] Person类的年龄改变了
2016-02-20 15:48:23.330 studyCategory[652:8132] Person的年龄增加1岁了
Program ended with exit code: 0

这就说明我们的过程是没有问题的,Person的对象p1不但可以正常调用changeAge这个方法,也可以定义我们后来增加的autoChangeAge的功能。

通过Category这个功能把类的方法切分在了不同的文件中,具体有什么好处,我在以后的学习过程中体验到了会补充出来的,毕竟现在只是学习过程,先把功能学会。

 

 

 

    

 

以上是关于IOS开发-ObjC-Category的使用的主要内容,如果未能解决你的问题,请参考以下文章

iOS分类(category)、类扩展(extension)、继承的区别

iOS的Runtime机制下给类别(category)添加属性替换原有类的方法执行

iOS Category实现原理 (补充)

iOS开发底层之类加载(中) - 13

iOS开发底层之类加载(中) - 13

iOS面试 --Objective-C相关