类别是另一种为现有类添加新行为的方法。不同于子类,类别实际上是oc的一种动态行为,它利用了运行时分配机制。因此,类别甚至不需要拥有原类的源代码。此外,类别不能向现有的类中添加实例变量。
类别有很多好处,比如把类的实现分散到多个implementation文件里,或者用于创建非正式协议;
类别也有一些限制,在类别的使用中一定要注意两点:
类别仅仅是一堆方法的集合,你无法为类添加实例变量。
类别不能解决命名冲突,如果类别中的方法与类原有的方法重名,则类中的方法被覆盖。
oc中的协议等同于java接口的概念,协议看起来就像类别的生命,还是一堆方法声明的集合。
正式协议的意思是,每个采用这份协议的类必须实现这份协议中的所有方法,这种说法一直持续到oc2.0,从oc2.0开始,协议中的方法可以有选择的由类实现。对于必须实现的方法,用关键字@required修饰,对于可选择性实现的方法,使用@optional关键字修饰。
非正式协议不需要采用@protocol关键字声明,但需要创建一个类别。