类的本质: 类也是一个对象 一个类在内存中只有一块存储空间,类是一个类对象(用Class类型创建出来的对象) 例如:Person类,是class类型的对象,简称类对象 步骤: Class类,创建Person类对象 Person类对象,创建Person类型的对象 Person *p = [[Person alloc]init]; [p class];---->获取内存中的类对象 Class c = [p class];--->c就是内存中的Person类 Class c2 = [p class];--->c和c2是相同的 注意:Class c是一个指针类型的变量,Class包含* 当输出二者地址时,可验证是否相同: NSLog(@"c=%p,c2=%p", c, c2);--->地址是相同的 第二种方式获取内存中的类对象: Class c3 = [Person class]; 备注:类对象==类,类==类对象 Class c = [p class];--->c是一个类对象,可以调用类方法 类的加载和初始化: Student :Person--->先加载父类,再加载子类 + (void)load;--->在类被加载的时候调用,且类只能加载一次 当main函数中使用到了Student类时--->[[Student alloc] init] + (void)initialize; 备注: 当程序一启动时,就会加载一次项目中所有的类和分类,且类加载完毕后,就会调用+ (void)load 方法 当第一次使用某一个类时,就会调用该类的+ (void)initialize方法(先调用父类的该方法) 备注: 当程序中存在分类,那么会调用分类中+ load方法 注意: main函数中使用到Person类,优先调用其分类的+ initialize方法,如果分类没有,那么 调用类的,类的没有,再调用父类的 总结: 1. 当程序启动时,就会加载项目中所有的类和分类,加载后会调用每个类和分类的+load方法(仅一次) 2. 当第一次使用某个类时,就会调用当前类的+initialize方法 (优先级:分类--->类--->父类) 3. 先加载父类,在加载子类(先调用父类的+load方法,在调用子类的+load方法) 先初始化父类,在初始化子类(先父类+initialize,再子类+initialize) 4. initialize方法可以用来监听类在何时被使用 注意: 当一个项目中,存在,父类,子类,以及父类的分类时,程序启动,加载完毕后,类的加载顺序为:父类--->子类--->父类的分类 如果一个类(Person)有分类(Person(PJ))的话,当在main函数中使用到该类(Person)的子类(Student):[[Student alloc] init],那么initialize方法只会被子类及其分类调 用,而类本身的initialize不会被调用。 |