什么是Category

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

Category的用途

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

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

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

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

Category的用法

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

  1. @interface ClassName (CategoryName)
  2. -methodName1
  3. -methodName2
  4. @end

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

  1. @implementation ClassName (CategoryName)
  2. -methodName1
  3. -methodName2
  4. @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文件,在里面添加如下代码:

  1. #import <Foundation/Foundation.h>
  2. @interface NSString (ReverseNSString)
  3. + (NSString*) reverseString:(NSString*)strSrc;
  4. @end

实现Category

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

  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

剩下的工作就是验证我们的Category了,在view中添加一个按钮ReverseString,并设置相应的action方法为reverseString.在view上再添加一个label,命名为myString,默认值是”HelloCategory Design Pattern!”。点击按钮反转这个字符串。主要代码如下:

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

代码组织

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

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

Category VS添加子类

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

    1. 如果需要添加一个新的变量,则需添加子类。
    2. 如果只是添加一个新的方法,用Category是比较好的选择。
    3. 在分类中增加的方法,会被子类所继承,而且在运行时跟其他方法没有区别。
    4. 一般不要在分类中覆盖现有类中的方法。

Category 不添加成员变量

@property 声明的属性只会自动生成get,set方法,并不能生成下划线的成员属性

延展(Extension)

  1. 类的延展就如同时“匿名”的分类,延展中声明的方法在类本身的@implementation和它对应的@end之间实现。
  2. 类又是需要方法只有自己所见,我们可以通过延展的方式定义类的私有方法。

iOS设计模式——Category和 Extension的更多相关文章

  1. iOS中Category和Extension 原理详解

    (一)Category .什么是Category? category是Objective-C .0之后添加的语言特性,别人口中的分类.类别其实都是指的category.category的主要作用是为已 ...

  2. iOS设计模式——Category

    什么是Category Category模式用于向已经存在的类添加方法从而达到扩展已有类的目的,在很多情形下Category也是比创建子类更优的选择.新添加的方法同样也会被被扩展的类的所有子类自动继承 ...

  3. ios中的category与extension

    http://blog.csdn.net/haishu_zheng/article/details/12873151   category和extension用来做类扩展的,可以对现有类扩展功能或者修 ...

  4. iOS学习笔记06—Category和Extension

    iOS学习笔记06—Category和Extension 一.概述 类别是一种为现有的类添加新方法的方式. 利用Objective-C的动态运行时分配机制,Category提供了一种比继承(inher ...

  5. IOS设计模式之一(MVC模式,单例模式)

    iOS 设计模式-你可能已经听说过这个词,但是你真正理解它意味着什么吗?虽然大多数的开发者可能都会认为设计模式是非常重要的,然而关于设计模式这一主题的文章却不多,并且有时候我们开发者在写代码的时候也不 ...

  6. iOS类别(Category)

    iOS类别(Category)与扩展(Extension) 苹果的官方文档 Category在iOS开发中使用非常频繁.尤其是在为系统类进行拓展的时候,我们可以不用继承系统类,直接给系统类添加方法,最 ...

  7. iOS设计模式 - 装饰

    iOS设计模式 - 装饰 原理图 说明 1. cocoa框架本身实现了装饰模式(category的方式实现了装饰模式) 2. 装饰模式指的是动态的给一个对象添加一些额外的职责,相对于继承子类来说,装饰 ...

  8. iOS 设计模式

    很赞的总结 iOS Design Patterns 中文版 IOS设计模式之一(MVC模式,单例模式) IOS设计模式之二(门面模式,装饰器模式) IOS设计模式之三(适配器模式,观察者模式) IOS ...

  9. Category VS Extension 原理详解

    (一)Category 1.什么是Category? category是Objective-C 2.0之后添加的语言特性,别人口中的分类.类别其实都是指的category.category的主要作用是 ...

随机推荐

  1. sqlalchemy多表联合查询的左连接、右连接等使用

    #按用户名摸糊查询trans_details.query.join(Uses).filter(Users.username.like('%xx%'))#select xxx from trans_de ...

  2. Ansible 2.0公布

    本文来源于我在InfoQ中文站翻译的文章,原文地址是:http://www.infoq.com/cn/news/2016/02/ansible-2-released 经过了一年的开发工作后,Ansib ...

  3. Solid Edge性质管理者 如何获取装配体的BOM表 物料清单

    工具-性质管理者 在里面可以输入每个文件的文件号,版本号,作者等信息   右击点击显示性质,你还可以添加或删除文件属性   把需要的属性更改好了之后,可以输出装配体的所有零件信息到Excel中,点击工 ...

  4. react 项目实战(十)引入AntDesign组件库

    本篇带你使用 AntDesign 组件库为我们的系统换上产品级的UI! 安装组件库 在项目目录下执行:npm i antd@3.3.0 -S 或 yarn add antd 安装组件包 执行:npm ...

  5. openstack页面自己定义插件使用具体解释(django、ajax、post)(zTree为例)

    感谢朋友支持本博客,欢迎共同探讨交流.因为能力和时间有限,错误之处在所难免,欢迎指正! 如有转载.请保留源作者博客信息. Better Me的博客:blog.csdn.net/tantexian 如需 ...

  6. 【code】flex_进度条样式

    近期打算吧硬盘中的资料记录在博客中,实用的就当是个分享,无用的就当是个备份,还望大家不要见怪. 一共4个文件: JinDuTiaoItem.mxml: <?xml version="1 ...

  7. _DataStructure_C_Impl:图的遍历

    #include<stdio.h> #include<stdlib.h> #include<string.h> //图的邻接表类型定义 typedef char V ...

  8. libsqlite3.dylib与libsqlite3.0.dylib的差别

    在我们加入数据库框架时,在搜索框中输入sqlitekeyword,以下列表区会显示libsqlite3.dylib,libsqlite3.0.dylib. 此时我们选择libsqlite3.0.dyl ...

  9. JavaScript全局属性/函数

    JavaScript 全局属性和方法可用于创建Javascript对象. JavaScript 全局属性 属性 描述 Infinity 代表正的无穷大的数值. NaN 指示某个值是不是数字值. und ...

  10. ios30---pthread, NSThread, GCD, NSOperation

    pthread(线程库,很早就有的技术,了解):一套通用的多线程API适用于Unix\Linux\Windows等系统(java开发也有pthread)跨平台\可移植使用难度大(全是C函数) C语言 ...