———Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ———
类也是一个对象
->其实类也是一个对象,是Class类型的对象,简称"类对象"
->Class类型的定义
typedef structobjc class *Class;
->类名就代表着类对象,每个类只有一个类对象.
任何对象都是有自己的类型,那么既然类也是一个对象,那它应该也有自己的类型
类是class类型的对象,简称类对象
利用Person类创建出三个对象,在内存中如下图所示:
任何对象在创建之前都会把类先加载进内存,利用Person类在内存中创建对象分为两步:
1.先利用class类型创建一个Person类对象(把Person类加载进内存)
2.再利用Person类对象创建Person类型的对象
1.调用对象的某个对象方法 对象的class 方法,返回class类型
Class c1 = [p1 class]; 此处的c1就是内存中的Person类
Class c2 = [p2 class];
打印c1和c2之后发现两者相等,所以说调用每一个Person对象获取的类都是一样的,内存中只有一个Person类,p1和p2都是Person类创建出来的对象,所以调用对象方法获取的类对象都是Person这个类
2.调用类方法
[Person class]; 通过类的class方法来获取内存中的类对象,此时,设置Class c3 = [Person class];打印结果和刚才的两个一样
类对象的使用
既然类对象就是类,那么类对象也就可以调用类的方法了
Class c = [p class]; // c是类对象,那么他就可以调用类方法+test了
[c test];
Person *p1 = [[c alloc] init]; // 此处的c就相当于是Person,用类对象来创建对象
类的加载和初始化
在程序一启动的时候,系统会把所有的类都加载一遍,那么如何看类加载的先后顺序呢?
在类加载完成时系统会调用一个类方法,+load方法,因此用load方法来验证类加载的先后顺序:在Student和Person类中都重写load方法,加载哪一个类就调用哪一个的load方法,同时输出类名加方法名,如
+ (void)load
{
NSLog(@"Person+load");
}
主函数中不写任何东西,直接点击运行,打印结果先是输出Person+load然后输出Student+load,再加入Person的分类进行验证,分类是最后加载的所以可以得出:
+load方法
1.当程序一启动时,就会加载项目中的所有类和分类,而且加载后会调用每个类和分类的+load方法,只会调用一次
2.先加载父类,再加载子类(先调用父类中+load方法,再调用子类的+load方法)
3.先加载原始类,再加载分类
4.不管程序运行过程中有没有用到这个类,都会调用+load方法加载
但是如果想知道什么时候使用了这个类,那么就要用到+initialize方法,它是用到某个类才加载时调用的方法,同样是在各个类中写入initialize方法并输出对应语句来验证,结果总结如下:
+initialize方法
1.当第一次使用某个类时,就会调用当前类的+initialize方法(使用到类,比如创建对象时)
2.先调用父类的+initialize方法,再调用子类的+initialize方法
3.优先调用分类的initialize方法