1.分类主要用来为某个类添加方法,属性,协议(我一般用来为系统的类扩展方法或者把某个复杂的类的按照功能拆到不同的文件里)
2.扩展主要用来为某个类原来没有的成员变量、属性、方法。注:方法只是声明(我一般用扩展来声明私有属性,或者把.h的只读属性重写成可读写的)
分类和扩展的区别:
1.分类是在运行时把分类信息合并到类信息中,而扩展是在编译时,就把信息合并到类中的
2.分类声明的属性,只会生成getter/setter方法的声明,不会自动生成成员变量和getter/setter方法的实现,而扩展会
3.分类不可用为类添加实例变量,而扩展可以
4.分类可以为类添加方法的实现,而扩展只能声明方法,而不能实现
分类的局限性:
1.无法为类添加实例变量,但可通过关联对象进行实现,注:关联对象中内存管理没有weak,用时需要注意野指针的问题,可通过其他办法来实现,具体可参考iOS weak 关键字漫谈
2.分类的方法若和类中原本的实现重名,会覆盖原本方法的实现,注:并不是真正的覆盖
3.多个分类的方法重名,会调用最后编译的那个分类的实现
分类的结构体里有哪些成员
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;//实例属性列表
// 此属性不一定真正的存在
struct property_list_t *_classProperties;//类属性列表
};