Category和extension扩展
2019-08-14 本文已影响0人
Peanut_S1
1.Category分类同一个方法创建多个,会出现什么问题,为什么?
针对这个问题,我大概去了解了一下类目的底层构造。
类目里的方法是在runtime运行机制的作用下,合并到其类的方法列表了了,并非“把类里的方法覆盖掉”,而是一并列关系。方法调用的顺序也是
(Category->本类->父类)。
当多个category中存在同名的方法,运行时到底调用哪个方法由编译器决定,最后一个参与编译的方法会被调用。
- Category的好处:
- 实现对类的扩展,将类的实现分散到多个文件管理,不同的功能API进行了分类
2.把framework的私有方法公开。如果直接调用其他类的私有方法会报错,可以在类目中声明这些方法(不必提供方法实现),编译器就不会再产生警告。
3.category局限性
- 实现对类的扩展,将类的实现分散到多个文件管理,不同的功能API进行了分类
是可以为一个类添加属性的,但是一定做不到添加成员变量,不要混淆了成员变量和属性的概念。
分类中用@property定义变量,只会生成变量的getter,setter方法的声明,不能生成方法实现和带下划线的成员变量。
因为在编译完成后,对象的内存布局已经确定,如果添加实例变量会破坏类的内部布局。
扩展
可以给类添加属性和方法,但都是私有的
extension是在编译时决议的,是类的一部分。
category时运行时,把category的实例方法,协议与类的实例方法,协议合并到一起的,类方法添加到metaclass的。
因此,运行时期对象的内存结构已经确定,如果添加属性会破坏类的内存布局,所以不可以添加实例变量。