2.类别和扩展

什么是类别:

类别是为现有类添加新方法的一种方式。


类别要解决的问题是?

在不访问类源代码,以及不添加子类的情况下,为现有的类增加新方法。
子类是一种办法,但是面对类簇和工具包或类库时确没有能力为力
类别解决了这个问题。


类别的作用?

1.在不需要知道类源码的情况下扩展现有类,并且可以将类的实现分散到多个模块(文件)中。

类的主声明可以放在多个文件中,但实现只能在一个模块中,通过类别可以实现分散存放类定义

2.创建对类的私有方法的前向引用

3.向对象添加非正式引用


类别相对于子类的优点:

1.类别可以将类的实现模块化到多个模块中。

2.系统中已经存在的对类的引用在使用类别扩展类以后可以不必发生变化就能继续引用。

例如,假设系统中存在一个类A;另外一个类B中定义了一个类A类型的实例变量,并包含了类A的头文件“#import<A.h>"。假设一段时间后,需要对类A扩展几个新的方法。如果用子类,就需要创建一个子类A-1。如果类B想要使用类A的新方法,就要进行如下修改:1)将包含的头文件改为"#import<A-1.h>";2)将所有用到的类A对象改为类A-1的对象。可以想象,如何有很多类需要用到类A的新功能(比如类A是iOS中的类UIViewController),随着系统的升级(iOS从1.0到5.0),你的程序需要不停地进行这种繁琐地修改。如果使用类别,即使类A升级了,系统中其它的类可以不需任何修改,直接就可以调用类A的新方法。 

3.实现了功能的局部化封装,没有包含 类别 模块不会被引用。类别定义可以放在一个已存在的类(类A)的定义文件中(.h)。这意味着这个类别只有在类A被引用的前提下才会被外部看到。如果另一个类(类B)不需要用到类A的功能(没有包含类A的.h文件),也就不会看到依附类A存在的类别。iOSSDK中广泛运用这种类别定义法来封装功能。例如,在  UINavigationController.h中定义了专为UINavigationController扩展的 UIViewController类别:
@interface UIViewController(UINavigationControllerItem)
@property(nonatomic,readonly,retain) UINavigationItem *navigationItem; 
@property(nonatomic,readonly,retain) UINavigationController *navigationController; 
......
@end
如果一个类不引用 UINavigationController.h,也就不会看到 navigationItemnavigationController这两个性质申明(declaredproperty)。
4.轻巧。很多时候,对已存在的类所需的扩展仅仅是几个新方法。这时,用类别避免了在系统中留下很多非常短小的“微”子类,使程序更加紧凑。


扩展 :扩展就是匿名分类,下面是一个扩展的例子:


@interface ClassA()

end

匿名分类可以添加变量和方法,添加的方法一定要在主类的实现部分实现,添加的方法是私有方法


子类比较类别的优点:

1.子类增加与父类同名的方法后能通过super区分和父类同名的方法,而类别重写后便不能再访问被重写的方法。因为类别添加的方法具有最高的优先级

2.类别只能增加方法,不能增加实例变量


类别的注意事项:

1.使用类别需要import主类接口

2.名称冲突,即类别中的方法与现有的方法重名。当发生名称冲突时,类别具有更高的优先级。你的类别方法将完全取代初始方法,从而无法再使用初始方法。有些编程人员在自己的类别方法名中增加一个前缀,以确保不发生名称冲突。

3.对象+分类名在整个空间是唯一的。

4.类别命名通常是主类+类别作为文件名





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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值