iOS底层原理 - 探寻Category本质 之 Extension

面试题引发的思考:

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

相关阅读更多精彩内容

友情链接更多精彩内容