iOS

Category与Extension

2018-08-19  本文已影响20人  说不出口的喵

1、Extension的基本用法

Extension的创建方法与Category一样,只要在原来选择Category选择Extension即可,比如我们为Person创建一个名为MyExtension的Extension,则最终会生成一个Person_MyExtension.h文件:

//  Person_MyExtension.h#import"Person.h"@interfacePerson()@end

但要注意的是和Category不同的是它不会生成Person_MyExtension.m文件。之后我们可以在Person_MyExtension.h中直接添加成员变量、属性和方法,如下:

//  Person_MyExtension.h#import"Person.h"@interfacePerson(){NSString* _address;}@property(nonatomic)NSIntegerage;-(NSString*)WhereAmI;@end

他常用的形式不是创建一个单独的文件,而是在实现文件中添加私有的成员变量、属性和方法。例如:

//  Person.m#import"Person.h"/////////Extension start///////////@interfacePerson(){NSString* _address;}@property(nonatomic)NSIntegerage;-(NSString*)WhereAmI;@end/////////Extension end///////////@implementationPerson-(NSString*)WhereAmI{return@"谁知道你在哪里";}@end

2、Extension与Category区别

Extension

在编译器决议,是类的一部分,在编译器和头文件的@interface和实现文件里的@implement一起形成了一个完整的类。

伴随着类的产生而产生,也随着类的消失而消失。

Extension一般用来隐藏类的私有消息,你必须有一个类的源码才能添加一个类的Extension,所以对于系统一些类,如NSString,就无法添加类扩展

Category

是运行期决议的

类扩展可以添加实例变量,分类不能添加实例变量

原因:因为在运行期,对象的内存布局已经确定,如果添加实例变量会破坏类的内部布局,这对编译性语言是灾难性的。

何形式的转载都请联系作者获得授权并注明出处。

上一篇下一篇

猜你喜欢

热点阅读