【引】objective-c,4:category的原理

objc_category主要参考博文:

http://blog.leichunfeng.com/blog/2015/05/18/objective-c-category-implementation-principle/

 

一般说来,给一个类或者对象动态增加方法的方式有2种,1,继承。2,关联。

category可以理解成是上面“关联”的一种具体实现。在不改变原有类的前提下,动态地给这个类添加一些方法。

 

实现原理:

category在oc1中的定义是,

typedef struct objc_category *Category;

是指向一个objc_category的结构体。在oc2中指向一个category_t的结构体,

这个category_t的定义是,

其中,

1,name是class_name,cls是要扩展的类,在runtime阶段根据name动态获取。

2,同时包含要添加的instancemethods,classMethods,protocols。

3,instanceProperties表示Category里所有的properties,这就是我们可以通过objc_setAssociatedObject和objc_getAssociatedObject增加实例变量的原因,不过这个和一般的实例变量是不一样的。普通的实例变量是在实例的内存结构里的。

  Q:category中声明的properties,是没有自动生成@ synthesize的。因此,也就没有set get 以及 _property,因此无法在set和get中对properties处理。因此一般是用AssociatedObject的方式。

 

runtime在被加载的时候,会load所有的类,category和protocol。其中,category在被加载时,

1,首先load category。

2,对category处理:实例方法被加入到了当前的类对象中, 类方法被加入到了当前类的Meta Class中。

  也就是把一个category的category_method_list的所有方法取出来,在类中生成新了method list。也就是重建类和元类的方法列表。

 

将类中的旧有方法和 Category 中新添加的方法整合成一个新的方法列表,生成后,主类中的方法和 Category 中的方法在 runtime 看来并没有区别,它们是被同等对待的,都保存在类或者元类的方法列表中。

 

转载于:https://www.cnblogs.com/Pegasus-xy/p/6171436.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值