Category可以在不需要创建子类或是修改原始类的基础上,动态为已经存在的类添加新的行为(方法),,这样可以保证类的原始设计规模较小,功能增加时再逐步扩展;实现了类的相关方法的模块化,把不同的类方法分配到不同的分类文件中。Category只能扩展方法,不能增加成员变量。方便团队合作时进行模块化开发。

使用场景:

  • 在定义类时的某些情况下(例如需求变更),你可能想要为其中某个或几个类添加新的方法;
  • 一个类中包含了许多不同种类的方法需要实现,而这些方法需要不同的团队成员去实现;
  • 在使用某些基础类库时,有可能希望实现一些自己需要的方法,比如写个NSString+JSON.h,为NSString这个类拓展一些解析JSON的方法;
//Catelogy的定义:

//定义NSString+JSON.h头文件
#import <Foundation/Foundation.h>
@interface NSString (JSON)
+ (NSString *)json;
@end //定义NSString+JSON.m实现文件
#import "NSString+JSON.h"
@implementation NSString (JSON)
+ (NSString *)json {
return @"{'id':10, 'name':'lyf'}";
}
@end //使用Catelogy:
#import "NSString+JSON.h"
//一定要先引用其头文件,如果是对自定义类的方法进行扩展,这里还需引用原始类的头文件
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSLog(@"%@", [NSString json]);
}
return ;
}

使用注意:

  • Category可以访问原始类的实例变量,但不能添加变量,如果想添加变量,可以考虑继承创建子类;
  • Category可以重载原始类的方法,但不推荐这么做,因为这样会覆盖原来的方法,导致无法访问原来的方法。如果需要实现重载,建议创建子类。

Objective-C:Category的更多相关文章

  1. 【引】objective-c,4:category的原理

    objc_category主要参考博文: http://blog.leichunfeng.com/blog/2015/05/18/objective-c-category-implementation ...

  2. Objective-C :Category

    Category 引入 在日常的开发中,可能会碰到这样的需求:给某个类增加方法.比如说,需要给NSString类增加一个打印的方法.当然,我们可以新建一个类比如TestString,并继承NSStri ...

  3. 深入理解Objective-C:Category

    摘要 无论一个类设计的多么完美,在未来的需求演进中,都有可能会碰到一些无法预测的情况.那怎么扩展已有的类呢?一般而言,继承和组合是不错的选择.但是在Objective-C 2.0中,又提供了categ ...

  4. ios警告:Category is implementing a method which will also be implemented by its primary class 引发的相关处理

    今天在处理项目中相关警告的时候发现了很多问题,包括各种第三方库中的警告,以及各种乱七八糟的问题  先说说标题中的问题  Category is implementing a method which ...

  5. boke练习: category类的编辑修改,总是提示:该分类名称已经存在

    boke练习: category类的编辑修改,总是提示:该分类名称已经存在 本利采用的dao是: jpaRepository方式 先看原始代码: category的实体类 @Entity public ...

  6. Objective-C:分类(Category、extension)

    分类(Category .Extension) (一)分类的划分     (2) 1.(命名的类别)类别Category:只能添加新的方法,不能添加新变量.           2.(未命名的类别)类 ...

  7. AVAudioSession(3):定制 Audio Session 的 Category

    本文转自:AVAudioSession(3):定制 Audio Session 的 Category | www.samirchen.com 本文内容主要来源于 Working with Catego ...

  8. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库

    在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...

  9. jQuery系列:Ajax

    1. load(url, [data], [callback]) 1.1 解析 载入远程 HTML 文件代码并插入至 DOM 中. 语法格式: load(url, [data], [callback] ...

随机推荐

  1. [Effective Java]第九章 异常

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  2. ServiceStack.OrmLite 笔记2 -增

    ServiceStack.OrmLite 笔记2 这篇主要介绍 增加 db.Insert(new Employee { Id = 1, Name = "Employee 1" }) ...

  3. return、 return false的用法

    1. return返回null,起到中断方法执行的效果,只要不return false事件处理函数将会继续执行,表单将提交2. return false,事件处理函数会取消事件,不再继续向下执行.比如 ...

  4. [转]linux中如何安装软件?

    Linux下软件的安装与卸载     在Windows下安装软件时,只需运行软件的安装程序(setup.install等)或者用zip等解压缩软件解开即可安装,运行反安装程序 (uninstall.u ...

  5. mybatis的xml文件中如何处理大小于号

    在mybatis的xml配置文件中会遇到大小于号转化的问题,解决问题的方法如下: 1.用转义字符把>和<替换掉 SELECT * FROM test WHERE AND start_dat ...

  6. LA 5135 Mining Your Own Business

    求出 bcc 后再……根据大白书上的思路即可. 然后我用的是自定义的 stack 类模板: #include<cstdio> #include<cstring> #includ ...

  7. LCA模板

    /*********--LCA模板--***************/ //设置好静态参数并构建好图的邻接表,然后调用lca_setquery()设置查询 //最后调用lca_start(),在lca ...

  8. java中的堆内存和栈内存

    Java把内存分成两种: 一种叫做栈内存 一种叫做堆内存 栈内存 : 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变 ...

  9. 转!数据库连接池概念、种类、配置(DBCP\C3P0\JndI与Tomact配置连接池)

    数据库连接池概念.种类.配置(DBCP\C3P0\JndI与Tomact配置连接池) 一.DBCP 连接:DBCP 连接池是 Apache 软件基金组织下的一个开源连接池实现. 需要的 java 包c ...

  10. Jqplot使用总结之二(双Y轴)

    最近需要用Jqplot做双Y轴的Chart图,首先我找到了文档上的例子并对数据做了一些调整: 1.例子展示: var s1 = [["2002-01-01", 112000], [ ...