OC基础-Category类别 、extension类扩展(八)

 我来答
舒适还明净的海鸥i
2022-07-19 · TA获得超过1.7万个赞
知道小有建树答主
回答量:380
采纳率:0%
帮助的人:70.3万
展开全部

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在运行期决议。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式