首先:
category是建立oc的runtime机制下的,Java,C++都是有runtime机制的语言。——runtime机制简单来说就是在编译时不确定对象类型,在运行时才确定。Category提供了一种比继承(inheritance)更为简洁的方法来对class进行扩展,无需创建对象类的子类就能为现有的类添加新方法,可以为任何已经存在的class添加方法,包括那些没有源代码的类(如某些框架类)。
类别的作用
类别主要有3个作用:
(1)可以将类的实现分散到多个不同文件或多个不同框架中,方便代码管理。也可以对框架提供类的扩展(没有源码,不能修改)。
(2)创建对私有方法的前向引用:如果其他类中的方法未实现,在你访问其他类的私有方法时编译器报错这时使用类别,在类别中声明这些方法(不必提供方法实现),编译器就不会再产生警告
(3)向对象添加非正式协议:创建一个NSObject的类别称为“创建一个非正式协议”,因为可以作为任何类的委托对象使用。
再来对比一下category和extension:
category和extension用来做类扩展的,可以对现有类扩展功能或者修改其功能。
在iOS中category应用是非常广泛的,系统自带的很多类都有多个category扩展功能。
一般category中可以定义新的方法、重写类原来的方法和添加readonly属性
而extension可以认为是匿名的category,但是这个extension相对于category有有一个特殊功能:
在extension中可以定义可写的属性,公有可读、私有可写的属性(Publicly-Readable, Privately-Writeable Properties)一般这样实现! extension里声明的方法需要在main implementation中实现,category不强制要求。