Objective-C中的类目(Category),延展(Extension),协议(Protocol)这些名词看起来挺牛的,瞬间感觉OC好高大上。在其他OOP语言中就没见过这些名词,刚看到这三个名词的时候,有种感觉这是不是学习的坎?这东西难不难?能不能学会?经过本人亲自验证,这三个东西理解起来还是蛮简单的,学过C++或者Java的小伙伴对比理解还是蛮轻松的。类目(Category)就是给已有的类扩充相应的方法,扩充的方法是公有的,类目还可以起到分模块的功能,下面会详细说到。 延展(Extension)这个名词就是是匿名类目的别称,匿名类目就叫做延展,延展可以实现类方法的私有化,具体如何实现,下面有源码。协议我个人感觉和Java中的接口极为相似,在定义对象时使用协议,个人感觉和Java中得泛型有着异曲同工之妙,看下文的详细介绍吧。(本文为笔者个人总结,欢迎批评指正)。
一.Objective-C中的类目(Category)
在Objective-C比其他OOP的编程语言多了个类目,在OC中除了用继承来扩充类的功能函数外我们还可以用类目来实现。学过C++的小伙伴们是否还记得友元这个概念呢?友元就是非本类的方法可以使用本类中得变量,这也是对类方法的一个扩充,个人感觉在OC中得类目和C++中的友元有着异曲同工之妙(仅代表个人观点,欢迎批评指正),下面我们就来详细的学习一下OC中得类目吧。
提到类目呢,首先我们会问我们具体能拿类目做些什么事情呢下面做一下总结:
1.可以用类目给已有的类扩充方法
2.可以用类目把类的实现按功能模块分为不同的文件
3.可以用来扩展NSObject类的方法,也叫做非正式协议
编译环境说明: iMac OS X 10.9 (13A603) 编译器:XCode 5.0.2版本
1.给已有的类扩充方法
在Xcode中新建CategoryTest类,在新建类中声明两个实例变量,在实现类中重写description方法,打印输出两个实例变量的值
代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
//CategoryTest.h #import @interface CategoryTest : NSObject //定义两个私有的属性 { @private int ludashi1; int ludashi2; } @end //CategoryTest.m #import "CategoryTest.h" @implementation CategoryTest //重写description方法 -(NSString *) description { return [NSString stringWithFormat:@"ludashi1 = %d, ludashi2 = %d", ludashi1,ludashi2]; } @end |
新建一个CategoryTest的类目,来进行对类方法的扩充,
代码如下:
1 2 3 4 5 6 7 8 9 |
// CategoryTest+CategoryExtendFunction.h // Memory // Created by ludashi on 14-8-4. // Copyright (c) 2014年 Mr.li. All rights reserved. #import "CategoryTest.h" @interface CategoryTest (CategoryExtendFunction) //利用类目扩展新的方法 -(void) extendFunction; @end |
实现文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// // CategoryTest+CategoryExtendFunction.m // Memory // Created by ludashi on 14-8-4. // Copyright (c) 2014年 Mr.li. All rights reserved. #import "CategoryTest+CategoryExtendFunction.h" @implementation CategoryTest (CategoryExtendFunction) //实现扩展的方法 -(void)extendFunction { NSLog(@"鲁大师,你好!我是通过类目扩展的方法!"); } @end |
测试运行结果:
1 |
2014-08-04 17:08:46.187 Memory[1621:303] 鲁大师,你好!我是通过类目扩展的方法! |
2.对把类中不同的功能模块分成不同的文件
1.给上面的类创建两个类目,类目中分别存放实例变量的getter和setter方法,为了节省篇幅下面给出其中一个类目的事例;
接口的声明:
1 2 3 4 5 6 7 8 9 10 11 |
// CategoryTest+Categgory1.h // Memory // Created by ludashi on 14-8-4. // Copyright (c) 2014年 Mr.li. All rights reserved. #import "CategoryTest.h" @interface CategoryTest (Categgory1) //声明Category中实例变量ludashi1的getter和setter方法 -(void) setLudashi1:(int) vLudashi; -(int) ludashi1; @end |
类目的实现文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |