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. C# const和readonly修饰符的区别

    const 的概念就是一个包含不能修改的值的变量.常数表达式是在编译时可被完全计算的表达式.因此不能从一个变量中提取的值来初始化常量.如果 const int a = b+1;b是一个变量,显然不能再 ...

  2. IOS推送--之开发模式测试

    参考文章:http://blog.csdn.net/showhilllee/article/details/8631734#comments 第一步.下载你工程的开发证书 第二步.从钥匙串访问中导出秘 ...

  3. ICC_lab总结——ICC_lab4:时钟树综合

    时钟树综合的理论知识总结在这里:http://www.cnblogs.com/IClearner/p/6580034.html 下面是实践环节:使用ICC进行时钟树综合. 这个实验的目标是: ·设置C ...

  4. windows系统解决github.com访问超时

    当github无法访问时,可以尝试在hosts文件中添加下面的内容 windows:c:\windows\system32\drivers\etc 192.30.252.131 https://git ...

  5. 解决mac os下mcss命令报错:env: node\r: No such file or directory

    标题无“转载”即原创文章,版权所有.转载请注明来源:http://besteam.im/blogs/article/31/. 我一直对字符界面有抵触感,即使会用vim,我的linux脚本(python ...

  6. letter-spacing+first-letter实现按钮文字隐藏

    本文地址:http://www.zhangxinxu.com/wordpress/?p=3557 一.文不在长,有货则灵 图片式按钮的文字隐藏看来是大家都比较关注的一个问题(分享讨论.微博转发等可见一 ...

  7. Shell常见用法小记

    shell的简单使用 最近发现shell脚本在平常工作中简直算一把瑞士军刀,很多场景下用shell脚本能实现常用的简单需求,而之前都没怎么学习过shell,就趁机把shell相关的语法和常见用法总结了 ...

  8. Docker镜像压缩

    一.Dockerfile合理分层 Dockerfile的写法不合理,有时候会导致镜像膨胀,由于Docker是分层设计,而在Dockerfile中,每一条指令都拥有自己的context,而执行到下一条指 ...

  9. DC平衡双向控制串行器 转接IC GM8913:LVTTL转FPD-LINK III芯片

    1 概述     GM8913型DC平衡双向控制串行器,其主要功能是实现将10或12位并行控制信号和一路时钟信号串行为一路2.8Gbps高速串行数据:同时接收低速通道信号实现模式配对的功能.芯片内部集 ...

  10. grep的用法笔记

    1.grep搜索不保护字符串的命令格式如下: #带-v参数 jevan@df ~ grep "agc" -vRn ./