OC分类(Category)
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)的更多相关文章
- OC的特有语法-分类Category、 类的本质、description方法、SEL、NSLog输出增强、点语法、变量作用域、@property @synthesize关键字、Id、OC语言构造方法
一. 分类-Category 1. 基本用途:Category 分类是OC特有的语言,依赖于类. ➢ 如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式 ● 继承 ● 分类(Categor ...
- OC中分类(Category)和扩展(Extension)
1.分类的定义 category是Objective-C 2.0之后添加的语言特性,中文也有人称之为分类.类别.Category的主要作用是为已经存在的类添加方法.这个大家可能用过很多,如自己给UIC ...
- 从C#到Objective-C,循序渐进学习苹果开发(3)--分类(category)和协议Protocal的理解
本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验.本文继续上一篇随笔<从 ...
- Runtime - ③ - 分类Category探究
写博客只是为了让自己学的更深刻,参考:https://tech.meituan.com/DiveIntoCategory.html 分类(Category)是个啥玩意儿这里就不多介绍了,这里主要是研究 ...
- OC分类(类目/类别) 和 类扩展 - 全解析
OC分类(类目/类别) 和 类扩展 - 全解析 具体见: oschina -> MyDemo -> 011.FoundationLog-OC分类剖析 http://blog.csdn. ...
- 关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol
关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol 2014-02-18 19:57 315人阅读 评论(0) 收藏 举报 1.category, ...
- Objective-C分类 (category)和扩展(Extension)
1.分类(category) 使用Object-C中的分类,是一种编译时的手段,允许我们通过给一个类添加方法来扩充它(但是通过category不能添加新的实例变量),并且我们不需要访问类中的代码就可以 ...
- iOS之分类(category)
1.分类(category)的作用 1.1作用:可以在不修改原来类的基础上,为一个类扩展方法.1.2最主要的用法:给系统自带的类扩展方法. 2.分类中能写点啥? 2.1分类中只能添加“方法”,不能增加 ...
- Objective-C:继承、分类(Category、extension)、协议(protocol),个人理解,仅供参考
总结:继承.分类(Category.extension).协议(protocol) 一.继承: (1)特点: 继承多用于一般父类中的方法功能比较齐全,子类从父类继承过来使用,可以省略很多重复的代码 ...
随机推荐
- SEQ序号与ACK序号理解总结
备查 SEQ序号与ACK序号理解总结
- 一键部署Kubernetes高可用集群
三台master,四台node,系统版本为CentOS7 IP ROLE 172.60.0.226 master01 172.60.0.86 master02 172.60.0.106 master0 ...
- 无线接收信号强度(RSSI)那些事儿
本文由嵌入式企鹅圈原创团队成员黄鑫供稿. 本文所述的原理适用于所有无线传输技术,只是用蓝牙来举例.应该说,嵌入式企鹅圈更加偏重于嵌入式和物联网.安卓技术原理方面的知识分享和传播,其次才是实践,尽管很多 ...
- JavaEE开发之Spring中的事件发送与监听以及使用@Profile进行环境切换
本篇博客我们就来聊一下Spring框架中的观察者模式的应用,即事件的发送与监听机制.之前我们已经剖析过观察者模式的具体实现,以及使用Swift3.0自定义过通知机制.所以本篇博客对于事件发送与监听的底 ...
- Linux线程的创建
一.线程与进程的区别 1.线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源. 2.进程是资源分配的基本单位.所有与该进程有关的资源,都 ...
- Hadoop/Spark开发环境配置
修改hostname bogon 为localhost 查看ip地址 [training@bogon ~]$ sudo hostname localhost [training@bogon ~]$ h ...
- adobe edge animate 和 adobe animate cc 有啥区别?
经常有人问这两款软件的区别,每次都要打字好烦,特此总结发帖如下: 一.首先各自软件介绍 ①adobe edge animate 是adobe公司早期推出的一款网页互动工具.通过HTML+CSS+Jav ...
- Python之路-awk文本处理
作业一:整理博客,内容包含awk.变量.运算符.if多分支 一.awk 1.awk是一个优秀的文本处理工具,多用来处理含有特殊分隔符的内容 常见用法 awk -F: {print $1,$4} 作业 ...
- 在Activiti中如何使用自定义的组织架构
1.概述 我们知道,activiti是一个不错的流程引擎,它有自身的人员组织架构,但仅限于用户.用户组的管理,流程产生的任务(UserTask),就涉及到任务的所属人(Owner),任务的执行人(as ...
- Windows下Nginx的安装与使用(一):配置端口转发
什么是端口转发 当我们在服务器上搭建一个图书以及一个电影的应用,其中图书应用启动了 8001 端口,电影应用启动了 8002 端口.此时如果我们可以通过: localhost:8001 //图书 lo ...