当前位置: 首页 > 科技观察

#warning不要重写category中的方法

时间:2023-03-13 23:12:29 科技观察

在iOS开发中,category(类别,类别)是一个非常有用的东西。(纯文本,简短且罕见)我们可以向类中添加方法和属性。比如NSDateFormatter,每次new的成本都非常高,在tableview中尤为明显。有了category,我们就可以为它单独写一个实例,避免每次都为它开辟新的内存。那么,我们就想,如果我们用category重写这个类的方法呢?实际测试可行,覆盖。..但是,作为祖国的未来之花,我们不能这样!原因如下:1、Category没有办法替换子类,不能像子类一样通过super调用父类的方法实现。如果类中的重写重写了当前类中的某个方法,那么当前类中原来的方法实现将永远不会被执行,这在某些方法中是致命的。(ps:这里的+(void)load方法是一个特例,会在当前类执行完后在类别中执行。)2.同时,一个类别不能可靠地覆盖另一个类别中的同一个类同样的方法。比如UIViewController+A和UIViewController+B都重写了viewDidLoad,所以我们无法控制谁覆盖谁。3、通过观察头文件,我们可以发现Cocoa框架中的很多类都是通过类来实现功能的。你可能不小心重写了其中一个方法,有时会出现一些无法检查的异常原因。.4、类的诞生,只是为了方便开发者扩展一个类。它的本意不是让你换一个类。结论:重写方法,当然首先推荐通过子类重写父类的方法。在一些不方便重写的情况下,我们也可以利用runtime在类中进行methodswizzling(方法调配)。