今天看到一篇博客讲到了Catagory以及Extensiom以及继承,好久之前看过的了,所以现在也罢自己的理解总结一下
Catagory:
用到了OC运行时的特性,原则上只能用来给某个类添加方法,因为类目里面只有方法列表没有属性列表,利用runtime也可以添加属性,(只不过我对runtime理解的不是很深刻,等看完了就补。向下有效,对原类的所有子类都有效。如果只有声明没有实现,那么在运行调用时候才会报错 (运行时被添加到类的方法列表中)。可以访问原类的私有属性(因为是运行时的机制)。只对本Category有效,不会影响原类与其他类之间的关系在复杂的大工程与项目中可以将方法的声明和实现分散在不同的文件里面,方便管理。但是如果扩展的方法名与原类的方法名重名的时候,扩展的方法的优先级高于元类中的方法,并且会覆盖原来的方法,当你想要再次调用原类中的该方法时,那是不可能的,所以不建议扩展的方法名与原有类的方法名重名Extension:
既可以扩展属性也可以扩展方法可以实现某个类中属性和方法的私有制,方法只有声明没有实现的时候会报警告(编译时被添加到类额方法列表中)实现必须要在原类的.m里面实现继承:是面向对象语言的特性,既可以添加属性也可以添加方法 *如果要扩展的方法名与父类中的方法名重名,但是通过super关键字还可以调用 父类中的这个关键字 *不能访问父类私有变量这样只需要导入这个类目的头文件,就可以通过控件.width来访问,其他属性一样 可能大家会感到奇怪,不是说分类中不能扩展属性吗,那么头文件又是怎么回事,那是因为我们虽然用属性定义了变量,但是其实是相当于声明的该属性对应的setter和getter方法,并没有实现,如果我们没有自己实现,在调用时不管是_width还是self.width都会报错,对于_width来说是因为不能扩展,对于self.width来说是因为没有实现setter或者getter方法,如果我们自己实现了setter和getter方法用点语法调用就不会报错,但是用_width依然会崩。
继承 : 如果要扩展的方法与原类的方法名相同,但是又可以调用原类的方法如果不希望影响原类中的代码,只对该特定的类有效 Extension : 希望扩展后的方法为只为原类私有的时候。