我所理解的 Category

2016-07-18  本文已影响37人  Romit_lee

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

还有

等等

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

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是无法添加实例变量的(因为在运行期,对象的内存布局已经确定,如果添加实例变量就会破坏类的内部布局,这对编译型语言来说是灾难性的)。

上一篇 下一篇

猜你喜欢

热点阅读