什么是Category

Category模式用于向已经存在的类添加方法从而达到扩展已有类的目的,在很多情形下Category也是比创建子类更优的选择。新添加的方法同样也会被被扩展的类的所有子类自动继承。当知道已有类中某个方法有BUG,但是这个类是以库的形式存在的,我们无法直接修改源代码的时候,Category也可以用于替代这个已有类中某个方法的实体,从而达到修复BUG的目的。然而却没有什么便捷的途径可以去调用已有类中原有的那个被替换掉方法实体了。需要注意的是,当准备有Category来替换某一个方法的时候,一定要保证实现原来方法的所有功能,否则这种替代就是没有意义而且会引起新的BUG。和子类不同的是,Category不能用于向被扩展类添加实例变量。Category通常作为一种组织框架代码的工具来使用。

Category的用途

1.      在不创建继承类的情况下实现对已有类的扩展。

2.      简化类的开发工作(当一个类需要多个程序员协同开发的时候,Category可以将同一个类根据用途分别放在不同的源文件中,从而便于程序员独立开发相应的方法集合)。

3.      将常用的相关的方法分组。

4.      在没有源代码的情况下可以用来修复BUG。

Category的用法

在Obj-C中,声明某一个已有类的Category扩展的方法如下:

[html] view plain copy print ?
  1. @interface ClassName (CategoryName)
  2. -methodName1
  3. -methodName2
  4. @end
@interface ClassName (CategoryName)
-methodName1
-methodName2
@end

上面的声明通常是在.h文件中,然后我们在.m文件中实现这些方法:

[html] view plain copy print ?
  1. @implementation ClassName (CategoryName)
  2. -methodName1
  3. -methodName2
  4. @end
@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文件,在里面添加如下代码:

[html] view plain copy print ?
  1. #import <Foundation/Foundation.h>
  2. @interface NSString (ReverseNSString)
  3. + (NSString*) reverseString:(NSString*)strSrc;
  4. @end
#import <Foundation/Foundation.h>
@interface NSString (ReverseNSString)
+ (NSString*) reverseString:(NSString*)strSrc;
@end

实现Category

NSString+ReverseNSString.m文件中实现reverseString方法:

[html] view plain copy print ?
  1. #import"NSString+ReverseNSString.h"
  2. @implementationNSString (ReverseNSString)
  3. + (NSString*)reverseString:(NSString*)strSrc;
  4. {
  5. NSMutableString *reversedString =[[NSMutableString alloc]init];
  6. NSInteger charIndex = [strSrc length];
  7. while (charIndex > 0) {
  8. charIndex--;
  9. NSRange subStrRange =NSMakeRange(charIndex, 1);
  10. [reversedString appendString:[strSrcsubstringWithRange:subStrRange]];
  11. }
  12. return reversedString;
  13. }
  14. @end
#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!”。点击按钮反转这个字符串。主要代码如下:

[html] view plain copy print ?
  1. -(IBAction)reverseString:(id)sender {
  2. NSString *test = [NSStringreverseString:_myString.text];
  3. _myString.text = test;
  4. }
-(IBAction)reverseString:(id)sender {NSString *test = [NSStringreverseString:_myString.text];_myString.text = test;
}

代码组织

Category用于大型类有效分解。通常一个大型类的方法可以根据某种逻辑或是相关性分解为不同的组,一个类的代码量越大,将这个类分解到不同的文件中就显得越有用,每个文件中分别是这个类的某些相关方法的集合。

当有多个开发者共同完成一个项目时,每个人所承担的是单独的cagegory的开发和维护。这样就版本控制就更加简单了,因为开发人员之间的工作冲突更少了。

Category VS添加子类

并没有什么界限分明的判定标准来作为何时用Category何时用添加子类的方法的指导。但是有以下几个指导性的建议:

  1. 如果需要添加一个新的变量,则需添加子类。
  2. 如果只是添加一个新的方法,用Category是比较好的选择。

Category的用法相关推荐

  1. Objective-c中Category的用法

    1.类目(Category)的基本概念 封装是面向对象的一个特征,oc也不例外,但是有的时候我们会碰到一种情况,比如我们封装了一个类,不想再动它了,但是我们又需要在那个类中增加一个方法,这时候我们就不 ...

  2. Pandas高级教程之:category数据类型

    文章目录 简介 创建category 使用Series创建 使用DF创建 创建控制 转换为原始类型 categories的操作 获取category的属性 重命名categories 使用**add_ ...

  3. IOS中扩展机制Category和associative

    在ios开发中,有时候会遇到以下的问题,需要在一个类中添加自己的一些属性和方法.一般的做法是重写一个类来继承它,但是有时候就只是需要添加一些简单的属性和方法,那么这样做就显得过于麻烦,其实在IOS中还 ...

  4. 什么是Category

    Category在我们的代码中其实可以有很普遍的应用,只是很多人并没有感觉到它的优势,现在我就只讲一点,关于Category的用法: 我们通常定义变量和声明方法的时候,喜欢把这些东西写到.h文件中去: ...

  5. iOS学习笔记2(结合项目)--Category和Extension的区别

    在实际项目中,用到Category比较多,Category也很实用,我们可以把一些经常用到或者很通用的功能封装到一个Category里,当其他项目需要相同的功能时,我们可以直接拿来用,不用从零开始写, ...

  6. Android 应用基础知识(5)

    Intent用法-Componet.Action.Category的属性 Intent在英语中的意思是意图,android中的日常使用就是通过intent语句去表达不同的操作意图,让系统知道我们的意图 ...

  7. DeepLink的实现原理

    前言 之前我们又是看源码又是研究动画,今天分享一个比较简单的技术点:DeepLink. DeepLink,深度链接技术,主要应用场景是通过Web页面直接调用Android原生app,并且把需要的参数通 ...

  8. iOS 开发问与答(103-122)

    103. 设置 placeholder 的颜色 104. 定制 Badge View 的另一种方法 105. 为什么声明数组属性时报错"Type argument 'xxx' must be ...

  9. 深度解析iPhone Category用法

    深度解析iPhone Category用法是本文要介绍的内容,在开发3.0的iPhone静态库的时候,遇到了一些问题  .尽管我在应用程序链接的选项里头使用-ObjC的选项,我的程序在iPhone上运 ...

最新文章

  1. swap 将硬盘变内存
  2. python 库列表_python库安装列表
  3. Linux 中将用户添加到组的指令
  4. 前端学习(3120):item中的key
  5. xlwings删除数据_xlwings如何删除行和列?
  6. 天池-街景字符编码识别5-模型训练与验证
  7. jquery animate自定义动画
  8. powershell一行代码批量修改文件名(附命令详解)
  9. 苹果禁用FaceTime多人聊天功能:漏洞将很快修复
  10. FreeRTOS源码分析与应用开发04:消息队列
  11. 【算法】—— 不借助中间变量实现 swap
  12. 拓端tecdat|R语言在BRFSS数据中可视化分析探索糖尿病的影响因素
  13. linux live usb下载,LinuxLive USB Creator
  14. android缓存垃圾扫描功能吗,Android 系统缓存扫描与清理方法分析
  15. win10解除usb禁用_Win10系统禁用usb存储设备的设置方法
  16. 老中医给程序员的养生指北|开奖啦
  17. windows下安装禅道
  18. C#拆分PPT、PPT转视频、PPT转图片
  19. 关于WinNT和WinCE中使用NTP协议
  20. A Monocular SLAM System Leveraging Structural Regularity in Manhattan World

热门文章

  1. jQuery中过滤选择器的eq,ne等于gt大于lt小于
  2. c++RPG游戏《末日风暴》1.0.8
  3. 两个字与三个字对齐html,css三个字如何和两个字对齐?
  4. 如何打理水果店,夏天水果店怎么打理
  5. 转载:Unofficial Windows Binaries for Python Extension Packages
  6. blockIO trace
  7. 《1Q84》--[日]村上春树
  8. Python 准确获取今天是星期几的代码(isoweekday和weekday)
  9. Apache+Python+Windows进行CGI编程新手上路时的各种坑
  10. Maven中打胖包和瘦包