Category 分类 ,又称为类别、类目

概念

 Category有多种翻译:分类、类别、类目(一般叫分类的多)
Category式OC特有的语法,其他语言没有的语法(类似于C#语言中的"扩展方法"和partial 关键字

作用

 在不修改原有类的基础上增加新的方法
一个庞大的类可以分模式开发
一个庞大的类可以由多个人来编写,更有利于团队合作

使用Category的作用

 )对现有类进行扩展
比如,你可以扩展Cocoa touch框架中的类,你在列表中增加的方法会被子类所继承,而且在运行时跟其他的方法没有区别
)作为子类的替代手段
不需要定义和使用一个子类,你可以通过Category直接向已有的类里增加方法
)对类中的方法归类
利用category把一个庞大的类划分为小块来分别进行开发,从而更好地对类中的方法进行更新和维护

使用category的步骤

声明--->实现---->使用

注意:类别的命名规则
类别+扩展方法,如"NNString+countNum"
类别的接口声明与类的定义十分相似,但类别不继承父类,只需要带有一个括号,表明该类别的主要用途

category声明

 在.h文件中,声明类别:

     @interface ClassName(CategoryName)
NewMethod; //在类别中添加方法
//不允许在类别中添加变量
@end 说明:
声明类别格式:
)新增加的方法必须在写@interface 与 @end之间
)ClassName 现有类的类名(要为哪个类扩展方法)
)CategoryName 待声明的类别名称
)NewMethod 新增加的方法
注意:
不允许在声明类别的时候定义变量

category实现

 在.m文件中(也可以在.h中实现),实现类别:
@implementation ClassName(CategoryName)
NewMethod{
......
}
@end 说明:
实现类别格式
)新方法的实现必须写在 @implementation 与@end之间
)ClassName 现有类的类名
)CategoryName 待声明的类别名称
)NewMethod 新增加的方法的实现

1.

2.

3.

也可以通过图形界面生成类别

1.

2.

3.

分类的使用注意事项

 )分类只能增加方法,不能增加成员变量、@property(可能编译不报错,但是运行有问题)
)分类可以访问原来类中的成员变量
)如果分类和原来类出现同名方法,优先调用分类中的方法,原来类中的方法会被忽略
)方法调用的优先级(从高到低)
分类(最后参与编译的分类优先),只要有分类就优先调用分类,不考虑与主类的编译顺序

分类的编译顺序

最下面的最后编译

Category的非正式协议

 非正式协议:
非正式协议就是给NSObject类创建的类目又叫做非正式协议,非正式协议一般不需要进行实现,一般在子类中进行方法的重写. 例如:
#import "NSObject+run.h" @implementation NSObject (run)
-(void)run{
NSLog(@"NSObject run");
}
@end 然后写个Student 继承与NSObject
这样Student就可以直接运行 run方法
Student *stu = [Student new];
[stu run]; 这就是非正式协议

Category延展

 概念:
延伸类别又称为扩展(Extendsion)(也可以理解为匿名类别)
Extension是Category是一个特例
其名字为匿名(为空),并且新增加的方面一定要予以实现.(Category没有这个限制)
例如: @interface Student()
@end 实现:
通过延展来实现方法的私有,延展的头文件独立.这种方法不能实现真正的方法私有,当在别的文件中引入延展的头文件,那么在这个文件中定义的类的对象就可以直接调用在延展中定义所谓私有的方法
//对类的延展-隐藏方法 wrap的一种手段(非强制)
.h文件
@interface SceneManager()
+(void)wrap;
@end .m文件
@implementation SceneManager
+(void)wrap{
.....
}
@end 调用:
[SceneManager wrap];
//这里会报一个警告: Class method of "+wrap" not found
//不过虽然是警告,不过运行是正常的,不过这么写得自我规范上不好,即使编译器没有做强制限制,我们自己也要限制自己
//不然,延展方法就毫无意义可言 第二种实现:
延展的方式是延展没有独立的头文件,在类的实现文件.m中声明和实现延展,这种方法可以很好地实现方法的私有,因为在OC中是不能引入.m的文件的 .m文件
@interface SceneManager()
+(void)wrap;
@end
@implementation SceneManager
+(void)wrap{
......
}
@end 调用
[SceneManager wrap]; 第三种实现:
私有的方式是在.m文件中得@implementation中直接实现在@interface中没有声明的方法,这样也可以很好的实现方法的私有

OC分类(Category)的更多相关文章

  1. OC的特有语法-分类Category、 类的本质、description方法、SEL、NSLog输出增强、点语法、变量作用域、@property @synthesize关键字、Id、OC语言构造方法

    一. 分类-Category 1. 基本用途:Category  分类是OC特有的语言,依赖于类. ➢ 如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式 ● 继承 ● 分类(Categor ...

  2. OC中分类(Category)和扩展(Extension)

    1.分类的定义 category是Objective-C 2.0之后添加的语言特性,中文也有人称之为分类.类别.Category的主要作用是为已经存在的类添加方法.这个大家可能用过很多,如自己给UIC ...

  3. 从C#到Objective-C,循序渐进学习苹果开发(3)--分类(category)和协议Protocal的理解

    本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验.本文继续上一篇随笔<从 ...

  4. Runtime - ③ - 分类Category探究

    写博客只是为了让自己学的更深刻,参考:https://tech.meituan.com/DiveIntoCategory.html 分类(Category)是个啥玩意儿这里就不多介绍了,这里主要是研究 ...

  5. OC分类(类目/类别) 和 类扩展 - 全解析

    OC分类(类目/类别) 和 类扩展 - 全解析   具体见: oschina -> MyDemo -> 011.FoundationLog-OC分类剖析 http://blog.csdn. ...

  6. 关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol

    关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol 2014-02-18 19:57 315人阅读 评论(0) 收藏 举报 1.category, ...

  7. Objective-C分类 (category)和扩展(Extension)

    1.分类(category) 使用Object-C中的分类,是一种编译时的手段,允许我们通过给一个类添加方法来扩充它(但是通过category不能添加新的实例变量),并且我们不需要访问类中的代码就可以 ...

  8. iOS之分类(category)

    1.分类(category)的作用 1.1作用:可以在不修改原来类的基础上,为一个类扩展方法.1.2最主要的用法:给系统自带的类扩展方法. 2.分类中能写点啥? 2.1分类中只能添加“方法”,不能增加 ...

  9. Objective-C:继承、分类(Category、extension)、协议(protocol),个人理解,仅供参考

    总结:继承.分类(Category.extension).协议(protocol)   一.继承: (1)特点: 继承多用于一般父类中的方法功能比较齐全,子类从父类继承过来使用,可以省略很多重复的代码 ...

随机推荐

  1. 任何一款IDE的设计思路

    我们以Windows操作系统为例.现在,基于操作系统的任何计算机语言,我们说都是高级语言,从C开始.无论是哪一种,都是通过操作系统的API与计算机交互.即便.Net的FrameWork库从一定意义上何 ...

  2. C++移位运算符详解

    移位运算符包括左移"<<"和右移">>" 左移运算符<<: 1.无符号 语法格式:需要移位的数字<<移位的次数n ...

  3. 兼容主流浏览器的js原生函数封装

    1.获取和修改垂直滚动条的滚动距离 //获取滚动条滚动距离function getScrollTop(){ var fromTop=document.documentElement.scrollTop ...

  4. 较简单的用ajax修改和添加功能(链接数据库)

    修改和添加关于数据库的信息,可以用于任何的添加和修改 这些数据库和前面的随笔数据库是一样的 一.显示出数据库中的信息 (1)显示的效果也可以是用bootstrap的标签页显示(前面一定要引入boots ...

  5. Maven项目搭建(二):Maven搭建SSM框架

    上一章给大家讲解了如何使用Maven搭建web项目. 这次给大家介绍一下怎么使用Maven搭建SSM框架项目. 首先我们来看一下pom.xml的属性介绍: project: pom的xml根元素. p ...

  6. web之Respone

    服务器处理请求的流程:  服务器每次收到请求时,都会为这个请求开辟一个新的线程.  服务器会把客户端的请求数据封装到request对象中,request就是请求数据的载体!(袋子)  服务器还会创建r ...

  7. 第3章Zabbix完整监控

    p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; t ...

  8. codeforces 372E. Drawing Circles is Fun

    tags:[圆の反演][乘法原理][尺取法]题解:圆の反演:将过O点的圆,映射成不过O的直线,相切的圆反演出来的直线平行.我们将集合S中的点做反演变换:(x,y)->(x/(x^2+y^2), ...

  9. POJ1185炮兵阵地【动态规划】

    炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 26892   Accepted: 10396 Descriptio ...

  10. Poptest学员之当小厨师变成测试开发工程师

    没开玩笑,这是我们的真实案例.做培训以来,各行各业转行做测试的学员见得太多了.修车的.客服的.销售的.司机的.医护的.前台的等等.职位虽然不分贵贱,但是薪资却分多少.每个人心中都有让家人和自己过上好日 ...