黑马程序员---OC类的本质

来源:互联网 发布:邪恶网站源码 编辑:程序博客网 时间:2024/05/16 05:50

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

创建代码(以图片展示):

第一步:

创建Goodstudent类 :Student类 :Person类 :NSObject (冒号代表继承关系),以及Person类的分类:Person+MyPersonCategory;

并且给每一个类都重写load和initialize类方法,以Person类为例,如下图:


第二步:

验证在main函数中,创建任何对象的时候,load和initialize方法的调用情况如何,如下图:


第三步:

我们来验证一下,使用Person类的时候,方法调用情况,如下图:


第四步:

我们使用Goodstudent类的时候,方法调用情况,如下图:



好的,那我们来总结一下方法调用的情况,以及类的本质的基础知识:

类也是一个对象

->其实类也是一个对象,是Class类型的对象,简称"类对象"

->Class类型的定义

typedef structobjc class *Class;

->类名就代表着类对象,每个类只有一个类对象.

任何对象都是有自己的类型,那么既然类也是一个对象,那它应该也有自己的类型

类是class类型的对象,简称类对象

利用Person类创建出三个对象,在内存中如下图所示:


任何对象在创建之前都会把类先加载进内存,利用Person类在内存中创建对象分为两步:

1.先利用class类型创建一个Person类对象(把Person类加载进内存)

2.再利用Person类对象创建Person类型的对象

方法存在于类中并且每一个Person类的对象中都有一个isa指针指向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方法



0 0
原创粉丝点击