您的位置:首页 > 编程语言 > Go语言

Category和Extension

2016-05-10 15:26 225 查看
Extension和category

Category(类别):
Category在iOS开发中使用非常频繁,尤其是在为系统类进行拓展时,可以不用继承系统类,直接给系统类添加   方法,最大程度的体现了OC的动态语言特性。
通常的命名方式是:Category扩展的类名+Category name;
局限性:

1、无法向类中添加新的实例变量,类别没有位置容纳实例变量;
2、名称冲突,即当类别中的方法与原始类方法名称冲突时,类别具有更高的优先级,类别方法将完全取代初始方法。

类别的作用:

1、扩展一个其他实施者定义的类,可以为某个类增加方法,增加的方法会被子类继承,而且在运行时也不会和原始的方法有任何不同;
2、作为子类的一个替代方法,不需要定义一个子类来扩展已有的类,通过Category可以直接为类添加方法;
3、把实现一个新类的方法分布在多个源文件里,可以把一个很大的类的方法分组到几个Category里,然后把每个Category放在自己的文件里,Category在很多方面对开发过程都是有帮助的:
①提供一个简单地方式组合相关的方法。被定义在不同的类里的相似的方法可以被保存在同一个源文件里;
②当一个类是由多个开发者共同定义的时候,可以简化大类的管理;
③为一个非常大的类的增量编译提供方便;
④提高常用方法的本地参考;
⑤可以根据不同版本的程序配置不同的类,而无需为不同版本保持相同的源代码;
4、可以用来声明非正式协议;

注意:

1、Category的方法不一定非要在implementation中实现,也可以在其他位置实现,但是当调用Category的方法时,依据继承树没有找到该方法的实现,程序会崩溃。
2、Category理论上不能添加变量,但是可以使用@dynamic来弥补这种不足。

 
Extension(扩展):

1、常被称为是匿名的Category
2、用于给类添加新方法,但只作用于原始类,不作用于subclass
3、只能对有implementation源代码的类写Extension,对于没有implementation源代码的类,比如framework class,是不可以的
4、可以给原始类添加新方法,以及新属性

 
区别:

1、形式上来看,Extension是匿名的Category
2、Extension里声明的方法需要在mainimplementation中实现,Category不强制要求
3、Extension可以添加属性(变量),Category不可以

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: