学习MJ的视频课程,整理总结知识点–Objective-C中的对象

[TOC]

Objective-C中的对象,简称OC对象,主要分为3种

  1. instance对象(实例对象)
  2. class对象(类对象)
  3. meta-class对象(元类对象)

1. instance对象

instance对象是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象。

实例对象主要存储的是成员变量的具体值。

1
2
NSObject *object1 = [[NSObject alloc] init];
NSObject *object2 = [[NSObject alloc] init];

object1、object2是NSObject的instance对象(实例对象)它们是不同的两个对象,分别占据着两块不同的内存。

instance对象在内存中存储的信息包括:

  1. isa指针
  2. 其他成员变量

instance对象在内存中存储的信息

即:实例对象的地址是isa指针的地址,isa指针所在的内存空间后面紧跟着的是其它成员变量所占的内存空间。

2. class对象

类对象主要存储的这个类的信息

1
2
3
4
5
Class objectClass1 = [object1 class];
Class objectClass2 = [object2 class];
Class objectClass3 = object_getClass(object1);
Class objectClass4 = object_getClass(object2);
Class objectClass5 = [NSObject class];

objectClass1 ~ objectClass5都是NSObject的class对象(类对象),它们是同一个对象,每个类在内存中有且只有一个class对象

class对象在内存中存储的信息主要包括:

  • isa指针
  • superclass指针
  • 类的属性信息(@property)
  • 类的对象方法信息(instance method)
  • 类的协议信息(protocol)
  • 类的成员变量信息(ivar)

class对象在内存中存储的信息

3. meta-class 元类对象

1
2
// 将类对象当做参数传入,获得元类对象
Class objectMetaClass = object_getClass(objectClass5);
  • objectMetaClass是NSObject的meta-class对象(元类对象)
  • 每个类在内存中有且只有一个meta-class对象
  • meta-class对象和class对象的内存结构是一样的,但是用途不一样,
  • 在内存中存储的信息主要包括isa指针superclass指针类的类方法信息(class method)
  • ……

meta-class对象

1
2
// 判断是否为元类对象 runtime api
BOOL result = class_isMetaClass(objectClass3);

其它:objc_getClass, object_getClass函数

源码位于苹果开源的objc项目,相关部分如下

1
2
3
4
5
6
7
8
9
10
11
12
13
/***********************************************************************
* objc_getClass. Return the id of the named class. If the class does
* not exist, call _objc_classLoader and then objc_classHandler, either of
* which may create a new class.
* Warning: doesn't work if aClassName is the name of a posed-for class's isa!
**********************************************************************/
Class objc_getClass(const char *aClassName)
{
if (!aClassName) return Nil;

// NO unconnected, YES class handler
return look_up_class(aClassName, NO, YES);
}

传入字符串类名,去查找对应的类对象

1
2
3
4
5
6
7
8
9
10
11
12
/***********************************************************************
* object_getClass.
* Locking: None. If you add locking, tell gdb (rdar://7516456).
**********************************************************************/
Class object_getClass(id obj)
{
// 如果是instance对象,返回class对象
// 如果是class对象,返回meta-class对象
// 如果是meta-class对象,返回基类(NSObject)的meta-class对象
if (obj) return obj->getIsa();
else return Nil;
}
  • object_getClass参数对象的isa指针,查找到它类、元类对象
  • objc_getClass根据参数的字符,去匹配对应的class

总结

Objective-C中的对象,简称OC对象,主要分为3种

  1. instance对象(实例对象)
  2. class对象(类对象)
  3. meta-class对象(元类对象)

他们的在内存中存储的信息大致如下:
OC对象的分类

参考和源码

Apple Source Browser - objc

评论