iOS的category和protocol

        很多时候我们需要扩展一下现有的类,增加一点功能。如果有源码,修改一下即可,如果是第三方的库,就要麻烦一些。在C++中我们使用类继承的方法来实现,在ObjectiveC中当然也可以这么做,不过ObjectiveC还提供的一种简单实用的方法,就是category,对于一些很微小的功能增加,或者就是增加一个方法方便使用,用category是最轻量级的。

      xCode中已经提供了增加category的引导,比如我们想增加以下UILabel的内容竖直对齐的方法,那么就需要如下进行一定的设置:


      生成的文件名字是UILabel+VAlign.h/m,虽然不是必须是这样的,但往往约定俗成是类名+类别名。

      生成的代码如下:

@implementation UILabel (VAlign)

@end
      我们可以看见,这个和类的实现是很相似的,只是多了一个(VAlign),这个就说明这是UILabel类的一个名称是VAlign的类别。我们可以在类别里面添加方法,但是不能添加成员变量。这里又有一个特殊的地方,不能添加成员变量,显然就不能添加属性了,但我们可以用@dynamic关键字来添加属性(还是不能直接添加成员变量)。

      Category的方便性还是显而易见的,在开发过程中,常常会遇到需要对类进行修改,增加一些方法的情形。这样通过category机制,我们可以很简洁的实现这样的需求,同时也减轻了类的设计的难度。

      但Category也有它自身的缺点,一是无法添加新的成员变量,二是由于代码可能很分散,容易出现方法的重名。当方法出现重名时,类别的优先级是高于类本身的,就是说,如果类有一个foo()的方法,category也有一个foo()的方法,则我们使用foo()方法时,调用的时category的foo()方法。


      有一种特别的category,叫做class extension,它可以增加成员变量!它的语法格式就是无名的category

@implementation UILabel ()

@end
      你可以增加多个class extension,但如果使用过滥,也容易带来Bug。

      Category主要用途有3个:将类的实现代码分散到多个不同的文件和框架中,创建对死以后方法的前向引用,向对象添加非正式协议(informal protocol)。

      

      Category是非正式协议,那么iOS中肯定存在正式协议了(Protocol),正式的协议不像category一样松散,它是一系列方法的集合,分成强制和非强制两部分,当你要实现一个协议时,你需要实现所有强制方法,非强制方法可以根据实际情况来实现。 可以被继承。protocol可以继承,使用时是在类声明时用<>说明,常见的NSCopying、UITableViewDataSource、UITableViewDelegate等等。

posted @ 2014-02-22 10:46  嘟嘟夜未央  阅读(243)  评论(0编辑  收藏  举报