iOS的category和protocol

        不少时候咱们须要扩展一下现有的类,增长一点功能。若是有源码,修改一下便可,若是是第三方的库,就要麻烦一些。在C++中咱们使用类继承的方法来实现,在ObjectiveC中固然也能够这么作,不过ObjectiveC还提供的一种简单实用的方法,就是category,对于一些很微小的功能增长,或者就是增长一个方法方便使用,用category是最轻量级的。框架

      xCode中已经提供了增长category的引导,好比咱们想增长如下UILabel的内容竖直对齐的方法,那么就须要以下进行必定的设置:spa


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

      生成的代码以下:code

@implementation UILabel (VAlign)

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

      Category的方便性仍是显而易见的,在开发过程当中,经常会遇到须要对类进行修改,增长一些方法的情形。这样经过category机制,咱们能够很简洁的实现这样的需求,同时也减轻了类的设计的难度。orm

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


      有一种特别的category,叫作class extension,它能够增长成员变量!它的语法格式就是无名的categoryblog

@implementation UILabel ()

@end
      你能够增长多个class extension,但若是使用过滥,也容易带来Bug。

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

      

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

相关文章
相关标签/搜索