当前位置: 首页 > news >正文

[iOS 理解] Swift Runtime (1) 类

Warm up

先看一段代码:

import ObjectiveCclass Obj {var x: Double = 0
}let v: NSObjectProtocol = Obj() as! NSObjectProtocol
let result = v.isKind(of: Obj.self)
let size = class_getInstanceSize(Obj.self)

我们有一个没有继承 NSObject、没有遵循 NSObjectProtocol 的类 Obj,强制转换为 NSObjectProtocol 类型,执行协议方法,result 为 true。

最后获取该类的实例大小,size 为 24。

熟悉 Objc Runtime 的同学对这个结果已经不仅是疑惑了,简直是瞠目结舌!

Swift 根类

我们在 Foundation 里看到过两个根类:NSObject 和 NSProxy。
然而对于 Swift,苹果并没有直接在 Xcode 代码文档中说明 Swift 类有根类,更别提见到了,只提到所有类都遵循 AnyObject 协议,且可以类似对待 OC 中 id 一样对待 AnyObject。

但既然是类,ARC 语言里肯定就有引用计数,我们大可以猜测机制和 OC 类似,保存在每个对象里而不是垃圾回收机制;而且支持判断自己是不是某个类型,必然需要在对象中存储自己是哪种类型。等等原因,Swift 根类必然存在。

下载 Swift 源码做好准备!

根类结构

我们很容易在 swift 源码里找到(删减版):

// Real class name: mangled "Swift._SwiftObject"
#define SwiftObject _TtCs12_SwiftObject@interface SwiftObject<NSObject> {Class isa;RefCounts refCount;
}

大小 16 字节;
Swift 原生类遵循 NSObject 协议、使用 objc_class:可以直接被 Objc Runtime 使用、相同的对象模型

引用计数

注意到 OC 的引用计数是保存在 isa 中,而 Swift 原生类保存在单独的结构中。目前我还没了解到为什么要单独用一个容器存储引用计数,后面再更新。

不过我们可以从源码看到两种引用计数是如何同时工作的:

void *swift::swift_unknownObjectRetain(void *object) {if (isObjCTaggedPointerOrNull(object)) return object;if (objectUsesNativeSwiftReferenceCounting(object)) {return swift_retain(static_cast<HeapObject *>(object));}return objc_retain(static_cast<id>(object));
}

retain 时需要判断 Tagged Pointer、Swift Native Object,最后使用 objc_retain。

总结

这一节只是简单介绍了 Swift 对象的内存布局,比较简单。但是其互通 Objc Runtime 的特点为我们实现无限功能提供了基础。

http://www.lryc.cn/news/20194.html

相关文章:

  • ASEMI低压MOS管20N06参数,20N06体积,20N06大小
  • 常见前端基础面试题(HTML,CSS,JS)(四)
  • RabbitMQ发布确认模式
  • 零基础的人如何入门 Python ?看完这篇文章你就懂了
  • Atcoder abc257 E
  • 模拟退火算法改进
  • SpringBoot+HttpClient+JsonPath提取A接口返回值作为参数调用B接口
  • JUC 之 CompletableFuture
  • 7-vue-1
  • OpenAPI SDK组件介绍
  • 【Java】Synchronized锁原理和优化
  • 西北工业大学2020-2021学年大物(I)下期末试题选填解析
  • PHP - ChatGpt API 接入 ,代码,亲测!(最简单!)
  • 物联网MQTT协议简单介绍
  • Dubbo 源码解读:负载均衡策略
  • 吃瓜教程笔记—Task04
  • 进程地址空间(虚拟地址空间)
  • 【项目精选】基于Vue + ECharts的数据可视化系统的设计与实现(论文+源码+视频)
  • JavaScript Window Screen
  • 【双重注意机制:肺癌:超分】
  • 各种中间件的使用
  • Systemverilog覆盖率的合并和计算方式
  • (周末公众号解读系列)2000字-视觉SLAM综述
  • 力扣29-两数相除
  • 【MindSpore】安装和使用MindSpore 2.0.0版本简单实现数据变换Transforms功能
  • PRML笔记4-绪论中推断和决策小结
  • DSPE-PEG-Streptavidin;Streptavidin-PEG-DSPE;磷脂聚乙二醇链霉亲和素,科研用试剂
  • Java中的Stream
  • 【数据库】关系数据理论
  • 初阶C语言——结构体【详解】