Category模式用于向已经存在的类添加方法从而达到扩展已有类的目的,在不少情形下Category也是比建立子类更优的选择。新添加的方法一样也会被被扩展的类的全部子类自动继承。当知道已有类中某个方法有BUG,可是这个类是以库的形式存在的,咱们没法直接修改源代码的时候,Category也能够用于替代这个已有类中某个方法的实体,从而达到修复BUG的目的。然而却没有什么便捷的途径能够去调用已有类中原有的那个被替换掉方法实体了。须要注意的是,当准备有Category来替换某一个方法的时候,必定要保证明现原来方法的全部功能,不然这种替代就是没有意义并且会引发新的BUG。和子类不一样的是,Category不能用于向被扩展类添加实例变量。Category一般做为一种组织框架代码的工具来使用。html
1. 在不建立继承类的状况下实现对已有类的扩展。程序员
2. 简化类的开发工做(当一个类须要多个程序员协同开发的时候,Category能够将同一个类根据用途分别放在不一样的源文件中,从而便于程序员独立开发相应的方法集合)。app
3. 将经常使用的相关的方法分组。框架
4. 在没有源代码的状况下能够用来修复BUG。工具
在Obj-C中,声明某一个已有类的Category扩展的方法以下:spa
@interface ClassName (CategoryName) -methodName1 -methodName2 @end
上面的声明一般是在.h文件中,而后咱们在.m文件中实现这些方法:版本控制
@implementation ClassName (CategoryName) -methodName1 -methodName2 @end
咱们建立一个iOS Single View Applciation名为CategoryExample。而后为建立一个NSString类的category扩展。File->New->File而后选择 Cocoa Touch Objective-C category.命名为ReverseNSString.系统会自动生成一个固定格式ClassName+CategoryName的.h和.m文件。code
声明Categoryhtm
打开NSString+ReverseNSString.h文件,在里面添加以下代码:继承
#import <Foundation/Foundation.h> @interface NSString (ReverseNSString) + (NSString*) reverseString:(NSString*)strSrc; @end
实现Category
NSString+ReverseNSString.m文件中实现reverseString方法:
#import"NSString+ReverseNSString.h" @implementationNSString (ReverseNSString) + (NSString*)reverseString:(NSString*)strSrc; { NSMutableString *reversedString =[[NSMutableString alloc]init]; NSInteger charIndex = [strSrc length]; while (charIndex > 0) { charIndex--; NSRange subStrRange =NSMakeRange(charIndex, 1); [reversedString appendString:[strSrcsubstringWithRange:subStrRange]]; } return reversedString; } @end
-(IBAction)reverseString:(id)sender { NSString *test = [NSStringreverseString:_myString.text]; _myString.text = test; }
Category用于大型类有效分解。一般一个大型类的方法能够根据某种逻辑或是相关性分解为不一样的组,一个类的代码量越大,将这个类分解到不一样的文件中就显得越有用,每一个文件中分别是这个类的某些相关方法的集合。
当有多个开发者共同完成一个项目时,每一个人所承担的是单独的cagegory的开发和维护。这样就版本控制就更加简单了,由于开发人员之间的工做冲突更少了。
并无什么界限分明的断定标准来做为什么时用Category什么时候用添加子类的方法的指导。可是有如下几个指导性的建议:
若是本文有任何错误之处,欢迎拍砖指正,共同进步, 谢谢!