首页 > 代码库 > 【OC学习-21】什么是类的类目category和类的延展extension?以及如何创建和注意事项

【OC学习-21】什么是类的类目category和类的延展extension?以及如何创建和注意事项

(1)什么是类目

声明一个类时,有实例变量和方法,而如果事后想增加方法的话直接在类里面添加感觉会显得杂乱无章,如果创建一个子类的话,层级多了会糊涂掉。至此,类目诞生。

从上可知,类目就是类的一个派生,你可以理解成事“只有方法,没有实例变量”的一种子类。

(2)创建类目

可以和创建类一样通过New File >>> Objective-C category创建,选择从ASStudent类派生的话,如创建的名字是life,那么文件名则默认是ASStudent+life.h和ASStudent+life.m。具体文件格式如下:

//和子类的.h文件很像,只是类目名字是用括号()括起来的
#import "ASStudent.h"

@interface ASStudent (life)

@end

//和子类的.m文件很像,同样类目是在括号里面的
#import "ASStudent+life.h"

@implementation ASStudent (life)

@end

注意事项:

a:我们可以直接把这个类目的.h和.m内容写在类的.h和.m文件里面,这样阅读时可以一目了然;

b:类目只有方法没有实例变量,方法如果和类的方法重名的话会覆盖类原来的方法,也就是说回优先调用类目的方法。


(3)什么是延展

我们定义类时说在.h里写的变量如果不是public一般不能被直接调用需要用方法,而定义的所有方法都可以被调用,如果我有的方法不想被外部调用只给内部使用呢?至此,延展出现。

从上可知,延展就是类似于“定义私有方法”的一种子类。


(4)延展的创建

通过New File >>> Objective-C extension来创建,选择ASStudent类,延展名叫hello,那么会自动创建一个.h文件叫ASStudent_hello.h,没有.m文件,因为可以直接在类的.m里写即可。

//看形式,其实就是没有名字的类目
#import "ASStudent.h"

@interface ASStudent ()

@end

在类的.m里直接书写方法即可。

注意事项:

a:可以不通过创建文件来创建延展,可以直接在.m文件里写@interface和@implementation,注意这两个都要写在.m文件里,因为如果把@interface写在.h里,那么里面的方法都是public的;

b:可以直接省略@interface,直接在.m文件里写方法即可,但是建议书写,至少阅读起来在文件一开始的几行就告知了哪些是私有方法。

【OC学习-21】什么是类的类目category和类的延展extension?以及如何创建和注意事项