黑马程序员技术交流社区
标题: 类的深入研究小知识总结 [打印本页]
作者: JRayln 时间: 2015-3-30 09:19
标题: 类的深入研究小知识总结
类的本质:
类也是一个对象
一个类在内存中只有一块存储空间,类是一个类对象(用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不会被调用。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |