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. WebX框架学习笔记之二----框架搭建及请求的发起和处理

    框架搭建 执行环境:windows.maven 执行步骤: 1.新建一个目录,例如:D:\workspace.注意在盘符目录下是无法执行成功的. 2.执行如下命令: mvn archetype:gen ...

  2. Entity Framework 新手入门友好实例

    起因 因为实习的原因,程序之中用到了较多的数据库操作逻辑.如果每一处数据库操作都手写的话,工作量较大且后期不易于维护,所以希望能通过 ORM 框架来解决这两个问题. 在昨天之前,对于 ORM 这个词汇 ...

  3. CSS.06 -- 尚合网页模拟

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. python中input()与raw_input()的区别到底是啥?-----marsggbo原创作品为你解答

    首先先给出总结:input () = int(raw_input()) 有图有真相!!! 先看看input的例子: 可见用input键入得到int类型的数据,那如果输入一些非int类型的会怎么样呢? ...

  5. python学习随笔(三)

    在linux中输入密码,我们是看不到的,如果在python中直接输入是可以看的到的,执行以下程序 #!/usr/bin/env python username = raw_input("us ...

  6. nginx 入门配置

    这个星期公司的定期分享内容是Nginx,于是就要写作业了. 一.动静分离 1.下载Windows 版本的Nginx,解压,放到C盘下.进入目录,然后按然shift键右键,打开命令行,输入: start ...

  7. 老李分享: JSON

    老李分享: JSON    poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478, ...

  8. 老李分享:MySql的insert语句的性能优化方案

    老李分享:MySql的insert语句的性能优化方案   性能优化一直是测试人员比较感兴趣的内容,poptest在培训学员的时候也加大了性能测试调优的方面的内容,而性能优化需要经验的积累,经验的积累依 ...

  9. poj 3270 Cow Sorting (置换入门)

    题意:给你一个无序数列,让你两两交换将其排成一个非递减的序列,每次交换的花费交换的两个数之和,问你最小的花费 思路:首先了解一下什么是置换,置换即定义S = {1,...,n}到其自身的一个双射函数f ...

  10. Win7+CentOS双系统(二)

    在之前的文章中我们实现了Win7+CentOS6.3双系统的安装和使用,不过比较不幸的是在CentOS6.4版本时其安装文件大小已经超过了FAT文件系统所能容纳的单个文件大小4G.我们使用FAT文件系 ...