37 (OC)* 类别的作用

问题: OC中类别(Category)是什么?
Category类别是Objective-C语言中提供的一个灵活的类扩展机制。类别用于在不获悉、不改变原来代码的情况下往一个已经存在的类中添加新的方法,只需要知道这个类的公开接口,而不需要知道类的源代码。类别只能为已存在的类添加新的功能扩展方法,而不能添加新的属性。类别扩展的新方法有更高的优先级,会覆盖同名的原类的已有方法。

问题: Category类别与其他特性的比较?
与继承Inheritance的比较:
1.子类继承是进行类扩展的另一种常用方法,当然基于子类继承的扩展更加自由、正式,既可以扩展属性也可以扩展方法。类别可以在不获悉、不改变原来代码的情况下往里面添加新的方法,但也只能添加方法,不能添加属性,属于功能上的扩展。类别扩展的优点是不需要创建一个新的类,而是在系统中已有的类上直接扩展、拼装,不需要更改系统类就可以添加并使用扩展方法。

2.相对于子类继承扩展,类别的另一明显优势是实现了功能的局部化封装,扩展的功能只会在本类被引用时看到。例如,假设原类为UIButton,现在要使用类别扩展一些用于模块A的方法,那么这些扩展方法就可以定义在一个叫做UIButton+A.h的头文件中,只有在引用UIButton+A.h的地方,才能看到原UIButton类有模块A添加的那些扩展方法,如果不需要模块A的功能,不引用UIButton+A.h头文件就看不到UIButton的那些扩展方法的存在,实现扩展模块的隔离。

与扩展Extension的比较:

Category类别和Extension扩展的明显不同在于,后者可以添加属性。另外后者添加的方法是必须要实现的。Extension可以认为是一个私有的匿名的Category,因为Extension定义在.m文件头部,添加的属性和方法都没有暴露在头文件,在不考虑运行时特性的前提下这些扩展属性和方法只能类内部使用,一定程度上可以说是私有的。 ***

问题: 类别有什么作用和好处?类别的局限性和使用注意事项

作用:

可以将类的实现分散到多个不同文件或多个不同框架中(扩充新的方法);
可以创建对私有方法的前向引用;
可以向对象添加非正式协议;
局限性:

类别只能向原类中添加新的方法,且只能添加而不能删除或修改原方法,不能向原类中添加新的属性;
类别向原类中添加的方法是全局有效的而且优先级相对最高,如果和原类的方法重名,会无条件覆盖掉原来的方法,造成难以发现的潜在危险,因此使用类别添加方法一定注意保证是单纯的添加新方法,避免覆盖原来的方法(可以通过添加该类别的方法前缀来防止冲突),否则原方法被类别覆盖了,团队中其他成员不知情的情况下用到这个被覆盖的方法会出现意想不到的问题而难以察觉纠正。

问题: Category类别和Extension类扩展的使用方法?
类别和扩展的区别我们已经知道了,最明显的是类别不可以添加新属性而类扩展可以。类别的使用方法很简单,就是新建某个类的类别扩展文件,然后添加新的方法。而类扩展并不常用,只是常用在.m文件中的头部进行头文件的私有属性变量补充,也就是所谓的类的Continuous区域,是将不想暴露给外部的一些变量定义在类扩展中。



作者:爱笑的猫mi
链接:https://www.jianshu.com/p/52fd497bf4cc
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

posted on 2018-07-17 10:23  风zk  阅读(160)  评论(0编辑  收藏  举报

导航