学习MJ的视频课程,整理总结知识点–Objective-C中的对象
[TOC]
Objective-C中的对象,简称OC对象,主要分为3种
- instance对象(实例对象)
- class对象(类对象)
- meta-class对象(元类对象)
1. instance对象
instance对象是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象。
实例对象主要存储的是成员变量的具体值。
1 | NSObject *object1 = [[NSObject alloc] init]; |
object1、object2是NSObject的instance对象(实例对象)它们是不同的两个对象,分别占据着两块不同的内存。
instance对象在内存中存储的信息包括:
- isa指针
- 其他成员变量
即:实例对象的地址是isa指针的地址,isa指针所在的内存空间后面紧跟着的是其它成员变量所占的内存空间。
2. class对象
类对象主要存储的这个类的信息
1 | Class objectClass1 = [object1 class]; |
objectClass1 ~ objectClass5都是NSObject的class对象(类对象),它们是同一个对象,每个类在内存中有且只有一个class对象
class对象在内存中存储的信息主要包括:
- isa指针
- superclass指针
- 类的属性信息(@property)
- 类的对象方法信息(instance method)
- 类的协议信息(protocol)
- 类的成员变量信息(ivar)
3. meta-class 元类对象
1 | // 将类对象当做参数传入,获得元类对象 |
- objectMetaClass是NSObject的meta-class对象(元类对象)
- 每个类在内存中有且只有一个meta-class对象
- meta-class对象和class对象的内存结构是一样的,但是用途不一样,
- 在内存中存储的信息主要包括isa指针superclass指针类的类方法信息(class method)
- ……
1 | // 判断是否为元类对象 runtime api |
其它:objc_getClass, object_getClass函数
源码位于苹果开源的objc项目,相关部分如下
1 | /*********************************************************************** |
传入字符串类名,去查找对应的类对象
1 | /*********************************************************************** |
object_getClass
参数对象的isa指针,查找到它类、元类对象objc_getClass
根据参数的字符,去匹配对应的class
总结
Objective-C中的对象,简称OC对象,主要分为3种
- instance对象(实例对象)
- class对象(类对象)
- meta-class对象(元类对象)
他们的在内存中存储的信息大致如下:
参考和源码
Apple Source Browser - objc