类的扩展-category和extension

类别是一种为现有的类添加新方法的方式。利用Objective-C的动态运行时分配机制,Category提供了一种比继承(inheritance)更为简洁的方法来对class进行扩展,虽然Category不能够为类添加新的成员变量, 但是Category包含类的所有成员变量,即使是@private的。 无需创建对象类的子类就能为现有的类添加新方法,可以为任何已经存在的   class   添加方法 ,包括那些没有源代码的类(如某些框架类),但 不能删除修改之前的方法 。 


类别主要作用: 

(1)可以将类的实现分散 到多个不同文件或多个不同框架中,方便代码管理。 

简化类的开发工作(当一个类需要多个程序员协同开发的时候,Category可以将同一个类根据用途分别放在不同的源文件中,将常用的相关的方法分组。从而便于程序员独立开发相应的方法集合)。

(2)创建对私有方法的前向引用:如果其他类中的方法未实现,在你访问其他类的私有方法时编译器报错这时使用类别,在类别中声明这些方法(不必提供方法实现),编译器就不会再产生警告 ,运行时报错。

(3)向对象添加非正式协议:创建一个NSObject的类别称为“创建一个非正式协议”,因为可以作为任何类的委托对象使用。 

4. 也可以对框架提供类的扩展(没有源码,不能修改)。在没有源代码的情况下可以用来修复BUG。

当知道已有类中某个方法有BUG,但是这个类是以库的形式存在的,我们无法直接修改源代码的时候,Category也可以用于替代这个已有类中某个方法的实体,从而达到修复BUG的目的。然而却没有什么便捷的途径可以去调用已有类中原有的那个被替换掉方法实体了。需要注意的是,当准备有Category来替换某一个方法的时候,一定要保证实现原来方法的所有功能,否则这种替代就是没有意义而且会引起新的BUG。和子类不同的是,Category不能用于向被扩展类添加实例变量。Category通常作为一种组织框架代码的工具来使用。

类别的局限性

有两方面局限性:

(1)无法向类中添加新的实例变量,类别没有位置容纳实例变量。

(2)名称冲突,即当类别中的方法与原始类方法名称冲突时,类别具有更高的优先级。类别方法将完全取代初始方法从而无法再使用初始方法。


代码组织

Category用于大型类有效分解。通常一个大型类的方法可以根据某种逻辑或是相关性分解为不同的组,一个类的代码量越大,将这个类分解到不同的文件中就显得越有用,每个文件中分别是这个类的某些相关方法的集合。

当有多个开发者共同完成一个项目时,每个人所承担的是单独的cagegory的开发和维护。这样就版本控制就更加简单了,因为开发人员之间的工作冲突更少了。


特殊的分类:扩展

创建一个未命名的分类叫做扩展。此时可以通过定义附加的实例变量来扩展类。类的扩展中声明的方法为私有方法,需要在主实现区域实现,而不能在分离的实现区域中实现。必须实现类扩展的接口部分列出的全部方法。

未命名分类的方法都是私有的。如果一个类的某些数据和方法仅供这个类本身使用,把这些数据和方法放在该类的未命名分类中比较合适。

注意

1)不需要创建新文件,直接在原类的.m文件中声明和实现。

2)所谓私有时候仅.m通过[self method]访问,不能在外部通过[对象 method]访问。


关于分类的注意事项:

1.分类可以rewrite该类中的另一个方法。但是不鼓励这样做。其一:在分类中覆写一个方法之后就无法访问原来的方法。因此,必须讲原方法中的功能全部复制到替换方法中。合适的覆写选择是:在字类中覆写父类方法。这样可以在子类中通过向super发送消息引用父类的方法。

2.如果一个方法定义在多个分类中,调用该方法的语句不会指定使用哪个分类中的方法。

3.通过分类添加新方法来扩展类不仅会影响这个类,还会影响他的所有子类。这就存在潜在危险。

4.可以为同一个类添加多个类目,但类目名和方法不能重复。

5.不可以随意重写类中的方法。

6.所添加类与原类中方法同级,而且会被子类继承。


分类和扩展的区别:

1.扩展可以添加成员变量,分类绝对不可以。

2.分类必须在第一个@interface中声明方法,并且在@implementation中提供实现,不然运行时出错。而类扩展,你添加的方法是一个required API,如果不去实现,编译器会警告,而且这个方法的声明可以不在第一个@interface中去声明。

参考网址:

http://blog.sina.com.cn/s/blog_8a12ad25010120f3.html

http://blog.csdn.net/lovefqing/article/details/8289851

http://blog.csdn.net/weasleyqi/article/details/24330009


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值