返回

Swift Array 的底层实现揭秘

IOS

探索 Swift 中 Array 的底层实现

Array 的结构

从定义上来看,Array 是一个 struct 类型,即值类型。这意味着当您创建一个 Array 实例时,它将在栈上分配内存,而不是堆上。这使得 Array 具有更快的访问速度和更低的内存开销,但同时也意味着它不能像引用类型那样被修改。

Array 中只有一个属性 _buffer_buffer_runtime (_ObjC) 下是 _ArrayBuffer,否则是 _ContiguousArrayBuffer。在苹果的设备下应该都是兼容 Objective-C 的,因此我们可以将 _buffer 视为 _ArrayBuffer

struct _ArrayBuffer<Element> {
    var _storage: UnsafeMutablePointer<Element>
    var _count: Int
    var _capacity: Int
    init(start: UnsafeMutablePointer<Element>, count: Int, capacity: Int) {
        _storage = start
        _count = count
        _capacity = capacity
    }
    var _finalizedCountAndCapacity: (count: Int, capacity: Int) {
        return (count: _count, capacity: _capacity)
    }
    func withUnsafeBufferPointer<Result>(_ body: (UnsafeBufferPointer<Element>) throws -> Result) rethrows -> Result {
        return try body(UnsafeBufferPointer(_storage, count: _count))
    }
}

_ArrayBuffer 包含三个属性:

  • _storage:指向数组元素的原始指针。
  • _count:数组中元素的数量。
  • _capacity:数组的最大容量。

内存管理

当您创建一个 Array 实例时,Swift 会自动分配内存来存储数组元素。当您向 Array 中添加或删除元素时,Swift 会根据需要调整数组的容量。如果数组的容量不够,Swift 会分配一个更大的内存块,并将数组元素复制到新的内存块中。这个过程称为数组的重新分配(reallocation)。

数组的重新分配可能会导致性能下降,因此在使用 Array 时应尽量避免频繁地添加或删除元素。如果需要频繁地修改数组,可以使用 NSMutableArray 类来代替 Array。NSMutableArray 是一个可变数组,它允许您在不重新分配的情况下修改数组元素。

索引和迭代器

您可以使用下标运算符 ([]) 来访问 Array 中的元素。下标运算符接受一个整数参数,该参数指定要访问的元素的索引。

let array = [1, 2, 3, 4, 5]
print(array[2]) // 输出:3

您还可以在 Array 上使用 for-in 循环来迭代其元素。

for element in array {
    print(element)
}

// 输出:
// 1
// 2
// 3
// 4
// 5

数组缓冲区

Array 缓冲区是一个连续的内存区域,它存储了数组的元素。数组缓冲区的长度必须是数组容量的倍数。当您创建