Category详解
原文作者:num_one
原文链接:https://www.jianshu.com/p/b45e1dd24e32
声明:仅作学习, 没有商业用途, 如有侵权, 请联系删除
1、 什么是extension
extension被开发者称之为扩展、延展、匿名分类。extension看起来很像一个匿名的category,但是extension和category几乎完全是两个东西。和category不同的是extension不但可以声明方法,还可以声明属性、成员变量。extension一般用于声明私有方法,私有属性,私有成员变量。
扩展的用处
- 声明私有方法,
- 私有属性,
- 私有成员变量
扩展的特点&与分类区别
- 扩展编译时决议, 分类运行时决议
- 只能以声明形式存在,多数情况下寄生在宿主类的.m中
- 不能给系统类添加扩展, 可以给系统类添加分类
2、 extension的存在形式
category是拥有.h文件和.m文件的东西。但是extension不然。extension只存在于一个.h文件中,或者extension只能寄生于一个类的.m文件中。比如,viewController.m文件中通常寄生这么个东西,其实这就是一个extension:
`@interface ViewController ()`
`@end`
当然我们也可以创建一个单独的extension文件,如下图:
UIView_extension.h中声明方法:
导入UIView_extension.h文件进行使用:
注意:extension常用的形式并不是以一个单独的.h文件存在,而是寄生在类的.m文件中。
3、category和extension的区别 Category详解
extension可以添加实例变量,而category是无法添加实例变量。
因为在运行期,对象的内存布局已经确定,如果添加实例变量就会破坏类的内部布局,这对编译型语言来说是灾难性的。extension在编译期决议(就是类的一部分),category在运行期决议。
extension在编译期和头文件里的@interface以及实现文件里的@implement一起形成一个完整的类,extension伴随类的产生而产生,亦随之一起消亡。extension一般用来隐藏类的私有信息,无法直接为系统的类扩展,但可以先创建系统类的子类再添加extension。
category可以给系统提供的类添加分类。
extension和category都可以添加属性,但是category的属性不能生成成员变量和getter、setter方法的实现。