- OC对象的本质
- 我们平时编写的Objective-C代码,底层实现其实都是C\C++代码,转换过程大致为OC-->C/C++-->汇编-->机器语言
- Objective-C的对象、类主要是基于C\C++的结构体实现的
-
- 实际上分配了16个字节的存储空间给NSObject对象
- 真正有使用的空间是:一个指针变量所占用的大小(64bit,8个字节。32bit,4个字节)
-
- Objective-C中的对象,简称OC对象,主要可以分为3种
- instance对象(实例对象)
- class对象(类对象)
- meta-class对象(元类对象)
- 在内存中就是一个结构体,结构体里面只有一个isa指针,在内存中,只占8个字节(64位处理器下,32位处理器为4个字节,占用内存大小和处理器的寻址能力有关),用以存储成员变量的值
- 类能更好的说明为什么OC对象的本质结构体,由于类中可能会有多个不同类型的成员变量,那么这些类型不同的变量只能通过结构体来存储
- class对象在内存中存储的信息主要包括
- isa指针
- superclass指针
- 类的属性信息(@property)、类的对象方法信息(instance method)
- 类的协议信息(protocol)、类的成员变量信息(ivar)
- ......
上面代码的底层的实现为@interface Student : NSObject { @public int _no; int _age; }
struct Student_IMPL { Class isa; int _no; int _age; };
占用的内存大小为16字节
objectMetaClass是NSObject的meta-class对象(元类对象)
- 每个类在内存中有且只有一个meta-class对象
- meta-class对象和class对象的内存结构是一样的,但是用途不一样,在内存中存储的信息主要包括
- isa指针
- superclass指针
- 类的类方法信息(class method)
- ......
- instance的isa指向class
- 当调用对象方法时,通过instance的isa找到class,最后找到对象方法的实现进行调用
- class的isa指向meta-class
- 当调用类方法时,通过class的isa找到meta-class,最后找到类方法的实现进行调用