面试题引发的思考:
Q: Category(类别/分类)和Extension(扩展)的区别是什么?
- Extension在 编译 的时候,它的数据就已经包含在类信息中;
- Category是在 运行 的时候,才会将数据合并到类信息中。
- Extension仅存在于.h文件,或者类的.m文件中;
- Category是拥有.h文件和.m文件的类。
- Category只能添加对象方法、类方法、协议、属性;
- Extension还能添加成员变量。
- Category添加的属性不会生成成员变量,只会生成
get
方法、set
方法的声明,需要我们自己去实现。
1. Category(类别/分类)
由上篇文章可知:
Category的作用是:
- 在不修改原来类的基础上,为一个类扩展方法。
Category的实现原理:
- Category编译之后的底层结构是struct category_t,里面存储着分类的对象方法、类方法、属性、协议信息;
- 在程序运行的时候,Runtime会将Category的数据,合并到类信息中(类对象、元类对象中)。
2. Extension(扩展)
Extension的作用是:
- 能为某个类附加额外的属性,成员变量,方法声明;
- 一般的私有属性写到Extension中;
- 一般的Extension写到.m文件中。
Category是拥有.h文件和.m文件的类;而Extension只存在于一个.h文件中,或者Extension只存在于一个类的.m文件中。
在开发中Extension是非常常见的,比如新建的ViewController.m文件中:
#import "ViewController.h"
// Extension 可以声明属性、成员变量、方法
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}
@end
3. Category和Extension的区别
- Class Extension在编译的时候,它的数据就已经包含在类信息中;
- Category是在运行时,才会将数据合并到类信息中。
- Category只能添加对象方法、类方法、协议、属性;
- Extension还能添加成员变量。
- Category添加的属性不会生成成员变量,只会生成
get
方法、set
方法的声明,需要我们自己去实现。