本文共 1417 字,大约阅读时间需要 4 分钟。
延展类别又称为扩展(Extendsion) Extension是Category的一个特例其名字为匿名(为空),并且新添加的方法一定要予以实现。(Category没有这个限制)
@interface MyClass () { //类扩展 float value;}- (void)setValue:(float)newValue;@end
这种写法的类别叫匿名类别,又叫类扩展,所谓的扩展,其实就是为一个类添加额外的原来没有的变量、方法或者合成属性。
延展的三种实现方式:
方式一:
通过延展来实现方法的私有,延展的头文件独立。这种方法不能实现真正的方法私有,当在别的文件中引入延展的头文件,那么在这个文件中定义的类的对象就可以直接调用在延展中定义所谓私有的方法
// 对类的延展 - 隐藏方法 wrap的一种手段(非强制) .h文件@interface SceneManager ()+ (void) wrap;@end.m类的实现文件中 @implementation SceneManager + (void) wrap {NSLog(@"method of wrap"); }@end
调用[SceneManager wrap];// 这里会抱一个警告:Class method of "+ wrap" not found// 不过虽然是警告,不过运行是正常的,不过这么写在自我规范上不好,即使编译器没有做强制 限制,我们自己也要限制自己。// 不然,延展方法就毫无意义可言。
方式二:
第二种实现延展的方式是延展没有独立的头文件,在类的实现文件.m中声明和实现延展,这种方法可以很好的实现方法的私有,因为在OC中是不能引入.m的文件的
.m文件@interface SceneManager ()+ (void) wrap;@end@implementation SceneManager + (void) wrap {NSLog(@"method of wrap"); }@end调用[SceneManager wrap];
方式三:
第三种实现方法私有的方式是在.m文件中得@implementation中直接实现在@interface中没有声明的方法,这样也可以很好的实现方法的私有。
分类(Category)与类扩展(Extendsion)的区别:
Category有很多种翻译: 分类 \ 类别 \ 类目 (一般叫分类)
1.分类(Category)中只能增加方法
2.类扩展(Extendsion)不仅可以增加方法,还可以增加实例变量(或者合成属性),只是该实例变量默认是私有类型的(作用范围只能在自身类,而不是子类或其他地方)
3.类扩展(Extendsion)中声明的方法没被实现,编译器会报警,但是分类(Category)中的方法没被实现编译器是不会有任何警告的。这是因为类扩展(Extendsion)是在编译阶段被添加到类中,而分类(Category)是在运行时添加到类中
4.类扩展(Extendsion)不能像类别那样拥有独立的实现部分(@implementation部分),也就是说,类扩展所声明的方法必须依托对应类的实现(.m文件)部分来实现。 5.定义在 .m 文件中的类扩展方法为私有的,定义在 .h 文件(头文件)中的类扩展方法为公有的。类扩展是在 .m 文件中声明私有方法的非常好的方式。
转载地址:http://uykii.baihongyu.com/