分类、继承、扩展

2020-09-07  本文已影响0人  算命的李老师
==分类==

是不能添加属性的,只能关联属性。
属性包含 get,set ,成员变量,而分类里并没有可存储成员变量的地址。所以即使声明了属性,也找不到地址。

分类是不能添加属性的,只能关联属性。
是在在类中用二维数组维护。
当程序启动时,就会加载项目中所有的类和分类,而且加载后会调用每个类和分类的+load方法,只会调用一次
在初始化的时候,如果在分类中重写了+initialize方法,则会覆盖掉父类的

==继承==
继承的好处:

简单直接,关系在编译时定义,被复用的实现易于修改。
继承的缺点:

==extension==

extension看起来很像一个匿名的category,但是extension和有名字的category几乎完全是两个东西。

==category和extension的区别==

extension可以添加实例变量,而category是无法添加实例变量的(因为在运行期,对象的内存布局已经确定,如果添加实例变量就会破坏类的内部布局,这对编译型语言来说是灾难性的)。

==Category 为什么会替换掉原类的方法==

Runtime源码中记录了调用顺序

-objc_init
···
->remethodizeClass//重置类的方法
->attachCategories//绑定分类
->attachLists
->最核心的函数memmove和memcopy

所以系统是在运行时将分类中对应的实例方法、类方法等插入到了原来类或元类的方法列表中,且是在列表的前边

上一篇 下一篇

猜你喜欢

热点阅读