美文网首页
我所理解的 Category

我所理解的 Category

作者: Romit_lee | 来源:发表于2016-07-18 15:22 被阅读37次

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

    还有

    等等

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

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

    相关文章

      网友评论

          本文标题:我所理解的 Category

          本文链接:https://www.haomeiwen.com/subject/crgpjttx.html