(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文件里写方法即可,但是建议书写,至少阅读起来在文件一开始的几行就告知了哪些是私有方法。