Runtime系列(类与元类)

移动开发
如果你读过 Runtime系列(引文),可能会在其中发现一个词:类对象。那么什么是类对象?

如果你读过 Runtime系列(引文),可能会在其中发现一个词:类对象。那么什么是类对象?

先看一段代码

  1. NSArray *arr = [NSArray array]; 

他是怎么运行的?

上篇文章中提到,[receiver message]底层会调用id objc_msgSend(id self, SEL op, ...)。再来回顾一下id是什么

  1. struct objc_object { 
  2.     Class isa  OBJC_ISA_AVAILABILITY; 
  3. }; 
  4.  
  5. typedef struct objc_object *id; 

id指向一个对象,可以猜测[NSArray array]中的NSArray也是一个对象。可NSArray怎么会是对象?这就要引出本文的另一个主角元类了。

元类

其实NSArray和arr一样,也是对象,叫做类对象。

Class.png

可以看到,Class中也有个isa指针,他的指向就是自身的元类。

元类是类对象的类,类对象是元类的实例。

基于这种设计模式,不难发现:

1.我们以前调用 "+" 开头的类方法实际是在调用元类的对象方法
2.由于每个类有且只有一个,所以每个类对象都是其对应元类的单例

那么,元类是对象吗?
答案是肯定的,元类是对象。
如果元类也是对象,元类的类又是什么?

元类的类

再来看一张网上的示意图

示意图.png
  • 图解
    目前我所接触到的oc对象都继承自NSObject,不知道是否还有其他的Root class,这里以NSObject为例。
1.每个实例对象的类都是类对象,每个类对象的类都是元类对象,每个元类对象的类都是根元类(root meta class的isa指向自身)
2.类对象的父类最终继承自根类对象NSObject,NSObject的父类为nil
3.元类对象(包括根元类)的父类最终继承自根类对象NSObject

可见,类与元类是一个闭环。

责任编辑:倪明 来源: 简书
相关推荐

2024-01-29 16:47:44

函数封装开发

2021-04-26 10:01:25

JavaJava基础Runtime

2016-09-06 19:32:11

PythonWeb

2016-10-25 14:27:32

metaclasspython

2021-03-22 10:20:04

Python元类代码

2015-08-07 09:33:24

RuntimeModel

2010-06-09 10:04:59

UML类图

2024-04-02 11:34:09

成员对象封闭类C++

2009-07-22 09:31:59

Scala类类层级Java类

2010-06-10 16:09:28

路由选择协议

2015-08-06 15:20:21

runtimeIOS开发

2011-08-08 09:22:10

Python

2011-07-15 13:49:30

C++友元函数友元类

2010-01-15 18:35:25

C++的类

2013-05-20 17:04:09

2023-12-07 09:07:58

2024-03-08 08:26:25

类的加载Class文件Java

2013-05-29 10:28:05

综合布线系统综合布线技术综合布线施工步骤

2017-09-20 08:07:32

java加载机制

2014-09-18 09:24:28

超五类六类双绞线
点赞
收藏

51CTO技术栈公众号