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)、继承的区别