#warning 不要在category中重写方法

移动开发
我们可以给一个类添加方法和属性。好比如NSDateFormatter这玩意每次都new开销是非常大的,这在tableview中的体现尤为明显,有了category我们就可以为他写一个单例,避免了每次都为它开辟新的内存。

[[151478]]

在iOS开发中,category(类目、类别)是一个很好用的东西。(纯文字,短小而精罕)

我们可以给一个类添加方法和属性。好比如NSDateFormatter这玩意每次都new开销是非常大的,这在tableview中的体现尤为明显,有了category我们就可以为他写一个单例,避免了每次都为它开辟新的内存。

于是,我们想,如果用category去重写该类的方法,会怎样?实测可行,果然被覆盖了。。。但是,作为祖国未来的花朵,我们不能这么干!

理由如下:

1、category没有办法去代替子类,它不能像子类一样通过super去调用父类的方法实现。如果category中重写覆盖了当前类中的某个方法,那么这个当前类中的原始方法实现,将永远不会被执行,这在某些方法里是致命的。(ps:这里提一下,+(void)load方法是一个特例,它会在当前类执行完之后再在category中执行。)

2、同时,一个category也不能可靠的覆盖另一个category中相同的类的相同的方法。例如UIViewController+A与UIViewController+B,都重写了viewDidLoad,我们就无法控制谁覆盖了谁。

3、通过观察头文件我们可以发现,Cocoa框架中的许多类都是通过category来实现功能的,可能不经意间你就覆盖了这些方法中的其一,有时候就会产生一些无法排查的异常原因。

4、category的诞生只是为了让开发者更加方便的去拓展一个类,它的初衷并不是让你去改变一个类。

结论:

要重写方法,当然我们首推通过子类重写父类的方法,在一些不方便重写的情况下,我们也可以在category中用runtime进行method swizzling(方法的偷梁换柱)来实现。

责任编辑:chenqingxiang 来源: 大亮Coder 的简书
相关推荐

2022-08-10 14:36:05

Python循环函数

2015-04-28 10:35:01

设计

2011-01-19 12:52:49

WCF.NETC#

2023-09-27 10:19:37

类型video函数

2023-10-11 11:27:46

调试版本程序

2012-09-06 09:21:22

编程语言技术

2015-06-30 08:31:59

旧代码重写

2021-03-29 08:05:15

User项目安全

2019-04-15 14:05:56

MySQLUTF-8数据库

2014-08-04 15:30:39

Linux开源软件

2023-08-31 09:10:18

JavaScript调试

2015-07-27 15:27:11

程序员重写代码

2015-07-28 10:28:54

程序员代码

2018-05-07 15:59:39

代码程序员重写

2021-03-18 23:38:26

EqualsHashcode方法

2023-03-20 11:36:28

Linux命令

2021-03-04 21:57:12

Python编程语言计算

2015-08-07 10:40:31

UI主线程

2019-11-08 13:57:53

程序员Excel软件

2020-02-28 09:00:00

ObjectC#编程语言
点赞
收藏

51CTO技术栈公众号