1.分类只能增加方法(包括类方法和对象方法),不能增加成员变量
2.在分类方法的实现中可以访问原来类中的成员变量;
3.分类中可以重新实现原来类中的方法,但是会覆盖掉原来的方法(+load除外),导致原来的方法无法再使用(警告);
着重说下这个,尽量不要在分类中重写原类的方法,理由如下:
(1)、category没有办法去代替子类,它不能像子类一样通过super去调用父类的方法实现。如果category中重写覆盖了当前类中的某个方法,那么这个当前类中的原始方法实现,将永远不会被执行,这在某些方法里是致命的,但是如果子类实现了该方法,则子类的方法会覆盖掉分类和父类。(ps:这里提一下,+(void)load方法是一个特例,它会在当前类执行完之后再在category中执行。)
+(void)load方法,执行顺序:先调用父类,再调用子类,最后调用分类。
其他方法执行顺序:有子类则只执行子类,没有子类则只执行分类。
(2)、同时,一个category也不能可靠的覆盖另一个category中相同的类的相同的方法。例如UIViewController+A与UIViewController+B,都重写了viewDidLoad,我们就无法控制谁覆盖了谁。
(3)、通过观察头文件我们可以发现,Cocoa框架中的许多类都是通过category来实现功能的,可能不经意间你就覆盖了这些方法中的其一,有时候就会产生一些无法排查的异常原因。
(4)、category的诞生只是为了让开发者更加方便的去拓展一个类,它的初衷并不是让你去改变一个类。
结论:
当我们需要重写方法时,首推通过子类重写父类的方法,在一些不方便重写的情况下,我们也可以在category中用runtime进行method swizzling(方法的偷梁换柱)来实现。
4.方法调用的优先级:分类->原来的类->父类,若包含有多个分类,则最后参与编译的分类优先;
5.在很多的情况下,往往是给系统自带的类添加分类,如NSObject和NSString,因为有的时候,系统类可能并不能满足我们的要求。
6.在大规模的应用中,通常把相应的功能写成一个分类,可以有无限个分类,对原有类进行扩充,一般分模块写,一个模块一个分类。