一.类也是个对象:
其实类也是一个对象,是Class 类型的对象,简称 “类对象”
Class 类型的定义:(官方认证)
#if !OBJC_TYPES_DEFINED
/// An opaque type that represents an Objective-C class.
typedef struct objc_class *Class;
/// Represents an instance of a class.
struct objc_object {
Class isa OBJC_ISA_AVAILABILITY;
};
/// A pointer to an instance of a class.
typedef struct objc_object *id;
#endif
类名 就代表着类对象,每一个类就只有一个类对象。
//利用Person这个类,创建3个Person类型的对象,这三个对象相互独立的,互不干扰.
Person *p = [[Person alloc] init];
Person *p2 = [[Person alloc] init];
Person *p3 = [[Person alloc] init];
*[Person alloc] , 【0类对象 调用类方法】(类方法在元类中,它会检查类对象有没有alloc方法,没有就去类对象中找),根据person类对象在内存中开辟一个内存空间,返回一个实例化的对象。
*类对象 在程序中就只有一份,而每次alloc,都产生一个新的实例对象。
//获取内存中的类对象
Class c = [p class];
Class C2 = [p2 class];
Class c3 = [person class];
NSLog(@"c = %p, c2 = %p, c3 = %p",c,c2,c3);
//c=0x1000059d0 c2 = 0x1000059d0 c3 = 0x1000059d0;
注意:c和c1和c2打印出来的地址相同,可以证明所有的对象共用一个类方法(class)。
二.+load 和 initialize
+load:
- 在程序启动的时候会加载所有的类和分类,并调用所有类和分类的 +load方法
- 先加载父类,再加载子类,也就是先调用父类的+load,在调用子类的+load
- 先加载原始类,在加载分类
- 不管程序运行过程中有没有用到这个类,都会调用+load加载
+initialize
- 在第一次使用某个类时(比如创建对象等),就会调用一次 +initialize方法
- 一个类只会调用一次 +initialize 方法,先调用父类的,再调用子类的
注意:在初始化的时候,如果在分类中重写了+initialize方法,则会覆盖掉父类的。
三.获取类对象三种方式:
Class c = [person class];//类方法
//或者
Person *p = [Person new];
Class c2 = [p class];
//类对象调用类方法
Class c =[Person class];
Person *p2 = [c new];