
1.什么是分类
>分类:可以在不改变原有类前提的情况下,拓展很多新方法,但是不能拓展新的成员变量。
如果想要扩展新的成员变量,可以考虑使用继承。
2.分类的书写形式
>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