我所理解的 Category

 分类在项目中经常用到,比如说

还有

等等

总结下之前所用到分类,可以归纳为以下几个用法

1.分局业务或逻辑分离代码,把一个类可以分成多个文件.比如说一个复杂的逻辑类,可以分成多个分类,代码看起来直观,易更改.

2.多人操作一个类,同上 一个庞大的类 多人开发的话 公用一个文件 在处理上 会有所麻烦,尽量避免同时修改一个文件,所以每个开发人员可以自己修改一个分类,这样互相不干扰

3.给静态库添加新的方法,比如说 NSString 属于Foundation的类,不可修改,此时可以用分类去添加 NSString 的方法.

4.申明私有方法,某个类中有不想被外部调用的方法的话可以用分类将私有方法 包起来,

5.重写原有的类的方法,分类中可以重载某个原有类中的方法,弊端是再也调用不了原有的方法,使用需谨慎,一般重写建议用继承的方式.


分类方便了我们的代码,但是同时存在一些弊端:不能添加变量 (可以用 get set 方法,加上 Runtime 去设置一个变量和取一个变量)


还有一个就是 category 和 extension的区别,可是说extension是一个没有名字的category 但是严格来讲并不是,extension可以申请变量, category 并不可以,还有就是extension在编译期决议,它就是类的一部分,在编译期和头文件里的@interface以及实现文件里的@implement一起形成一个完整的类,它伴随类的产生而产生,亦随之一起消亡。extension一般用来隐藏类的私有信息,你必须有一个类的源码才能为一个类添加extension,所以你无法为系统的类比如NSString添加extension。但是category则完全不一样,它是在运行期决议的。就category和extension的区别来看,我们可以推导出一个明显的事实,extension可以添加实例变量,而category是无法添加实例变量的(因为在运行期,对象的内存布局已经确定,如果添加实例变量就会破坏类的内部布局,这对编译型语言来说是灾难性的)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容