OC基础-Category类别 、extension类扩展(八)
category是Objective-C 2.0之后添加的语言特性,category的主要作用是为已经存在的类添加方法.
可以看下 美图技术团队 的这篇文章
优势:
(1). 减少单个文件的体积
(2). 把不同的功能分配到不同的分类里,便于管理
(3). 可以按需加载想要的分类
局限性:
(1). 无法向类中添加新的实例变量
(2). 类别中的方法名与现有方法重名, 名称冲突.(冲突时,类别有更高的优先级)
我们知道,所有的OC类和对象,在runtime层都是用struct表示的,category也不例外,在runtime层,category用结构体category_t(在objc-runtime-new.h中可以找到此定义),它包含了:
1)、类的名字(name)
2)、类(cls)
3)、category中所有给类添加的实例方法的列表(instanceMethods)
4)、category中所有添加的类方法的列表(classMethods)
5)、category实现的所有协议的列表(protocols)
6)、category中添加的所有属性(instanceProperties)
从category的定义也可以看出category的可为(可以添加实例方法,类方法,甚至可以实现协议,添加属性)和不可为(无法添加实例变量)。
平常都是使用分类来对系统的类封装一些小功能,如 NSString判空处理 等,可以看下 ibireme大神开源的这个库YYCategories ,都是针对系统的类使用分类拓展的小功能,很实用。再来看看业界闻名的空白页框架 DZNEmptyDataSet ,它就是通过对 UIScrollView 使用分类功能,非常完美、无侵入的解决了无数据时,避免白屏的尴尬,改善用户体验。
extension的别名有很多,扩展、延展、匿名分类。它就是类的一部分,在编译期和头文件里的@interface以及实现文件里的@implement一起形成一个完整的类,它伴随类的产生而产生,亦随之一起消亡。
我们平时在.m文件里使用的
声明私有属性
声明私有方法
声明私有成员变量
编译时决议
只以声明的形式存在,多数情况下寄生在宿主类的.m中
一般的私有属性写到.m文件中的类扩展中
不能为系统类添加扩展
extension 在编译期决议, category在运行期决议。