(0071)iOS开发之Category VS Extension区别理解

来源:互联网 发布:zeppelin 源码编译 编辑:程序博客网 时间:2024/06/10 07:08
转载:

http://www.cocoachina.com/bbs/read.php?tid=235729

http://www.cocoachina.com/ios/20170406/19001.html


Category , Extension


1. Category 

利用Objective-C的动态运行时分配机制,Category提供了一种比继承更为简洁的方法来对class进行扩展,无需创建对象类的子类就能为现有的类添加新方法,可以为任何已经存在的class添加方法,包括那些没有源代码的类。 

 

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

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

 

@interface NSString (CategoryDemo) 

@end 

 

@implementation NSString (CategoryDemo) 

@end 

 

下面资源不错哦: 

Objective-C相关Category的收集 

 

需要注意的有两点:

1)category的方法没有完全替换掉原来类已经有的方法,也就是说如果category和原来类都有methodA,那么category附加完成之后,类的方法列表里会有两个methodA

2)category的方法被放到了新方法列表的前面,而原来类的方法被放到了新方法列表的后面,这也就是我们平常所说的category的方法会覆盖掉原来类的同名方法,这是因为运行时在查找方法的时候是顺着方法列表的顺序查找的,它只要一找到对应名字的方法,就会罢休,殊不知后面可能还有一样名字的方法。


 

2. Extension 

匿名的Category。类有时需要一些只为自己所见、所用的私有方法,这种私有方法可以通过延展的方式来声明,定义的方法在类本身的@implementation代码区域中进行实现。 

category是拥有.h文件和.m文件的东西。但是extension不然。extension只存在于一个.h文件中,或者extension只能寄生于一个类的.m文件中。比如,viewController.m文件中通常寄生这么个东西,其实这就是一个extension

Category不同的地方:可增加私有属性,声明的方法必须实现。 

@interface A 

@end 

 

@interface A (Setter) 

- (void)setNumber:(NSNumber *)newNumber; 

@end 

 

@implementation A 

 

- (void)setNumber:(NSNumber *)newNumber 

     //do something 

@end 

 

 

3.categoryextension的区别


categoryextension的区别来看,我们可以推导出一个明显的事实,extension可以添加实例变量,而category是无法添加实例变量的(因为在运行期,对象的内存布局已经确定,如果添加实例变量就会破坏类的内部布局,这对编译型语言来说是灾难性的)。

  • extension在编译期决议,它就是类的一部分,但是category则完全不一样,它是在运行期决议的。extension在编译期和头文件里的@interface以及实现文件里的@implement一起形成一个完整的类,它、extension伴随类的产生而产生,亦随之一起消亡。
  • extension一般用来隐藏类的私有信息,你必须有一个类的源码才能为一个类添加extension,所以你无法为系统的类比如NSString添加extension,除非创建子类再添加extension。而category不需要有类的源码,我们可以给系统提供的类添加category
  • extension可以添加实例变量,而category不可以。
  • extensioncategory都可以添加属性,但是category的属性不能生成成员变量和gettersetter方法的实现。


4.注意

1.注意:category是在运行时加载的,不是在编译时。

2.extension常用的形式并不是以一个单独的.h文件存在,而是寄生在类的.m文件中。




原创粉丝点击