一、在c++中静态变量和静态函数可以通过类来访问(实例对象也可以访问),而一般的变量都是通过实例对象来访问。
在oc中也有类对象和实例对象下面就来看看什么是ios中的类对象
1、类对象(class object) 它是个对象,是占用内存空间的一个变量,这个对象在编译的时候编译器就生成了,专门来描述某个类的定义),
这个类对象包含了Objective-C对象的一些信息包括Objective-C对象的方法调度表,实现了什么协议等等。这个包含信息就是Objective-C动态能力的根源了。
2、Object-C对类对象与实例对象中的 isa 所指向的类结构作了不同的命名:类对象中的 isa 指向类结构被称作 metaclass,metaclass 存储类的static类成员变量与static类成员方法(+开头的方法);实例对象中的 isa 指向类结构称作 class(普通的),class 结构存储类的普通成员变量与普通成员方法(-开头的方法).
这也就是说通过类对象访问静态变量和函数 实例对象访问普通的变量和函数
二、类与对象
那我们看看isa指针类型的数据结构是什么样的?如果抛开NSObject对象的其他的成员数据和变量,NSObject可以看成这样:
- @interface NSObject <NSObject> {
- Class isa;
- }
不考虑@interface关键字在编译时的作用,可以把NSObject更接近C语言结构表示为:
- struct NSObject{
- Class isa;
- }
Class是用typedef 定义的
Objective-C类是由Class类型来表示的,它实际上是一个指向objc_class结构体的指针。它的定义如下:
1 |
|
那NSObject可以这么写了
- struct NSObject{
- objc_class *isa
- }
查看objc/runtime.h中objc_class结构体的定义如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
在这个定义中,下面几个字段是我们感兴趣的:
isa:需要注意的是在Objective-C中,所有的类自身也是一个对象,这个对象的Class里面也有一个isa指针,它指向metaClass(元类),我们会在后面介绍它。
super_class:指向该类的父类,如果该类已经是最顶层的根类(如NSObject或NSProxy),则super_class为NULL。
cache:用于缓存最近使用的方法。一个接收者对象接收到一个消息时,它会根据isa指针去查找能够响应这个消息的对象。在实际使用中,这个对象只有一部分方法是常用的,很多方法其实很少用或者根本用不上。这种情况下,如果每次消息来时,我们都是methodLists中遍历一遍,性能势必很差。这时,cache就派上用场了。在我们每次调用过一个方法后,这个方法就会被缓存到cache列表中,下次调用的时候runtime就会优先去cache中查找,如果cache没有,才去methodLists中查找方法。这样,对于那些经常用到的方法的调用,但提高了调用的效率。
version:我们可以使用这个字段来提供类的版本信息。这对于对象的序列化非常有用,它可是让我们识别出不同类定义版本中实例变量布局的改变。