Objective-C的category与extension原理深入讲解

一、category与extension原理与区分

  1. extension是在一个类的.m文件里实现,是一个类组成的一部分。可以声明一些不严谨的私有属性和方法。(为什么说不严谨呢?因为属性可以通过KVC访问到,方法可以通过消息机制发送!)
  2. category是在runTime运行期加载的,extension和类一样都是在编译期加载,加载时期不一样
  3. category不能添加成员变量(是因为在运行期,对象的内存布局已经确定,如果添加成员变量就会破坏类的内存布局。《因为在编译时就用内存偏移(硬编码)固定了变量的访问地址》)。其次category的结构体内部没有成员变量字段。
typedef struct category_t {
    const char *name; //类名
    classref_t cls; //类
    struct method_list_t *instanceMethods; //实例方法列表
    struct method_list_t *classMethods; //类方法列表
    struct protocol_list_t *protocols; //协议列表
    struct property_list_t *instanceProperties; //属性列表
} category_t;
  1. 要添加属性只能通过关联对象添加。通过(AssociationsManager、AssociationsHashMap等等有关的一些中间类去存储对象的key与value)。由此可以看出添加的属性不在自身类的内部!

二、+load调用执行顺序

  1. category可以重写+load,可以调用,因为附加category到类的工作会先于+load方法的执行
  2. 调用顺序不遵循类继承的概念,先是类(如果有子类,也是从父类开始执行)后是categor(category先编译,先执行)
  3. 因为+load方法的添加从类先开始,最后到category。(具体可参考源码)
  4. +load方法执行不遵循消息机制,而是按照函数地址去执行的。所以说若有多个+load,就执行多个。

三、+ initialize说明

  1. +initialize方法的执行时机,是在类首次使用时。而且只调用一次,相当于懒加载。
  2. +initialize方法执行遵循类继承的概念,按照消息机制去执行。

四、Swift里的扩展

Swfit里的扩展是extension,与OC的category一样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值