Objective-c Category使用
2015-05-29 18:48
525 查看
Objective-c Category使用
转载:http://blog.csdn.net/lovefqing/article/details/8289851
什么是Category
Category模式用于向已经存在的类添加方法从而达到扩展已有类的目的,在很多情形下Category也是比创建子类更优的选择。新添加的方法同样也会被被扩展的类的所有子类自动继承。当知道已有类中某个方法有BUG,但是这个类是以库的形式存在的,我们无法直接修改源代码的时候,Category也可以用于替代这个已有类中某个方法的实体,从而达到修复BUG的目的。然而却没有什么便捷的途径可以去调用已有类中原有的那个被替换掉方法实体了。需要注意的是,当准备有Category来替换某一个方法的时候,一定要保证实现原来方法的所有功能,否则这种替代就是没有意义而且会引起新的BUG。和子类不同的是,Category不能用于向被扩展类添加实例变量。Category通常作为一种组织框架代码的工具来使用。
Category的用途
1. 在不创建继承类的情况下实现对已有类的扩展。
2. 简化类的开发工作(当一个类需要多个程序员协同开发的时候,Category可以将同一个类根据用途分别放在不同的源文件中,从而便于程序员独立开发相应的方法集合)。
3. 将常用的相关的方法分组。
4. 在没有源代码的情况下可以用来修复BUG。
Category的用法
在Obj-C中,声明某一个已有类的Category扩展的方法如下:
@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文件。
声明Category
打开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
剩下的工作就是验证我们的Category了,在view中添加一个按钮ReverseString,并设置相应的action方法为reverseString.在view上再添加一个label,命名为myString,默认值是”HelloCategory Design Pattern!”。点击按钮反转这个字符串。主要代码如下:
-(IBAction)reverseString:(id)sender { NSString *test = [NSStringreverseString:_myString.text]; _myString.text = test; }
代码组织
Category用于大型类有效分解。通常一个大型类的方法可以根据某种逻辑或是相关性分解为不同的组,一个类的代码量越大,将这个类分解到不同的文件中就显得越有用,每个文件中分别是这个类的某些相关方法的集合。当有多个开发者共同完成一个项目时,每个人所承担的是单独的cagegory的开发和维护。这样就版本控制就更加简单了,因为开发人员之间的工作冲突更少了。
Category VS添加子类
并没有什么界限分明的判定标准来作为何时用Category何时用添加子类的方法的指导。但是有以下几个指导性的建议:
如果需要添加一个新的变量,则需添加子类。
如果只是添加一个新的方法,用Category是比较好的选择。
相关文章推荐
- ArcSDE的SQL操作ObjectID获取方式
- OC学习篇之---Foundation框架中的NSObject对象
- file path: c++ #include vs. object-c #import
- Flask 中使用 JSON 响应页面的 Ajax 请求报错 TypeError: 'dict' object is not callable
- iOS Objective-C 身份证号码校验
- Objective-C中的self关键词
- Objective-C对象的申请空间与初始化
- WebService传输SoapObject数据出现 org.ksoap2.serialization.SoapObject cannot be cast to java.util.Vector的问题
- Java核心API -- 1(Object类)
- 浏览器提示Uncaught TypeError: object is not a function XXX onclick
- IOS开发系列—Objective-C之Foundation框架
- JQuery创建object 并自定义键、值(获取table中数据,封装成一个对象)
- UITableViewCell Property “icon” cannot be found in forward class object “DJWeiBo”
- 使用objection来模块化开发iOS项目
- 条款21:必须返回对象object时,不要返回其引用reference
- Cocoa 框架 For iOS(一) 框架的介绍,Objectivie-C运行时能力的解析等
- BING : Binarized Normed Gradients for Objectness Estimation at 300fps 论文笔记
- Windows之SignalObjectAndWait
- Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法
- Chapter12. Foundation Classes and selector in Objective-C