一、分类Category
1.什么是分类
>分类:可以在不改变原有类前提的情况下,拓展很多新方法,但是不能拓展新的成员变量。
如果想要扩展新的成员变量,可以考虑使用继承。
2.分类的书写xingshi
>1),分类头文件:
@interface 原有类 (分类名称)
// 方法声明
@end
> 2),分类的实现文件:
@implementation 原有类 (分类名称)
// 分类声明中的方法的实现
@end
3.使用注意
分类使用注意:
1),在分类中不能访问原始类primary中@private作用域的成员变量
2),如果分类实现了和原始类同名的方法,会覆盖原始类的这个方法,是的原始类的这个方法无法被调用
3),如果多个分类都实现了和原始类同名的方法,那么会优先调用分类的这个方法,而且是最后参加编译的那个优先级更高。
(也就是:分类(最后参与编译的优先)-->原始类-->原始类的父类)
所以,最好不好在分类中实现和原始类同名的方法
4.分类的好处
1), 可以将一个很大的项目分模块进行开发,减小项目的复杂性。
2),很多的功能被分散到不同的类中,由团队不同成员开发,增强团队合作性。
5.相关的操作
1)在Xcode 6.3版本中可以用快捷键 command + N 选择OS X下面的Objective-C File 建立相对应类的分类,进入项目中,不喜欢使用快捷键的可以按照File-->NEW-->File..来选择相应的文件操作。
2)建立的分类的声明和实现形如:
// 分类的声明
#import "Father.h" @interface Father (Work) //{ // int age; // 分类不能扩充成员变量 //} - (void)work; //- (void)walk; @end
// 分类的实现
#import "Father+Work.h" @implementation Father (Work)//原始类+分类名字 - (void)work { // NSLog(@"名字是%@的father在工作", _name); // 在分类中不能直接访问原有类中@private作用域的成员变量 NSLog(@"名字是%@的father在工作", self.name); } - (void)walk { NSLog(@"名字是%@的father+work在走路", self.name); } @end
二、类的本质
1. 类也是个对象
> 其实类也是一个对象,是Class类型的对象,可以简称为“类对象”
在Xcode中按住command键鼠标放在class点进去会发现原来class真正的面貌:
1 #if !OBJC_TYPES_DEFINED 2 /// An opaque type that represents an Objective-C class. 3 typedef struct objc_class *Class; 4 5 /// Represents an instance of a class. 6 struct objc_object { 7 Class isa OBJC_ISA_AVAILABILITY; 8 };
上述是Class类型的定义。
>类名就代表着类对象,每个类只有一个类对象。
>相关配图
2.+load 和 +initialize
> +load
在程序启动的时候会加载所有的类和分类,并调用所有类和分类的+load方法
先加载父类,再加载子类;也就是先调用父类的+load,再调用子类的+load
先加载元原始类,再加载分类
不管程序运行过程有没有用到这个类,都会调用+load加载
> +initialize
在第一次使用某个类时(比如创建对象等),就会调用一次+initialize方法
一个类只会调用一次+initialize方法,先调用父类的,再调用子类的
定义了一个Animal类,并让Cat继承于Animal用于演示 +load 和 +initialize
1 #import "Animal.h" 2 3 @interface Cat : Animal 4 - (void)quickEat; 5 @end 6 7 @implementation Cat 8 + (void)load 9 { 10 NSLog(@"Cat + load"); 11 } 12 13 + (void)initialize 14 { 15 NSLog(@"Cat + initialize"); 16 } 17 18 - (void)quickEat 19 { 20 NSLog(@"cat - eat"); 21 } 22 23 @end 24 // 输出结果 2015-08-27 07:28:51.047 03类的本质和初始化[1918:162703] Cat + load 2015-08-27 07:28:51.047 03类的本质和初始化[1918:162703] Cat + initialize