极致框架为什么不采用分类而是继承父类的方式?
理由1: 属性是 Objective-C的一项特性,用于封装对象中的数据,会在编译时自动向类新增实例变量,适应这一语言的高度动态的特性。继承父类,除了可以直接使用父类的属性,还能定义专有属性。但不应该在分类定义属性,这里的分类指的是狭义上开发者创建的第三方分类,分类不支持向类中新增实例变量,Objective-C还提供了一种叫“class-continuation”的分类,只有在这种分类中添加属性才会被支持。类所封装的数据应该全部在主接口(.h和“class-continuation”分类)中,这里是唯一能够定义实例变量的地方,属性只是定义实例变量及相关存取方法的“语法糖”,至于分类机制,则应将其理解为一种手段,目标在于扩展类的功能,将类的实现各种功能的方法分散在各分类中,更易于维护,而非封装数据。
经常见到的“class-continuation”分类
1 2 3
| @interface ClassName ()
@end
|
理由2: 分类方法容易覆盖主接口中的方法,即使通过修改方法命名也无法规避这一问题,对 SDK中的类添加分类方法,将导致所有使用了该类意外调用分类方法,出现意外的问题,还不好排查出现问题的原因,于是需要大量的分类维护工作来规避这一问题,因此尽量避免对 SDK中的类添加方法,如果必须这么做,别忘了时时维护你的分类。
你有没有遇到过断点在 QMUI或者 SD-Autolayout源码中,却找不到问题所在的情况?