Swift中的手动内存管理

C和Objective-C指针

  • 不透明指针
  • 自动释放UnsafeMutablePointer
  • CVaListPointer

指针的记忆状态

指针实例引用的内存可以处于几种状态之一。 许多指针操作只能应用于内存处于特定状态的指针。

  • 未分配
  • 分配和未初始化
  • 已初始化

除了以上三种状态外,内存可以是无类型的或绑定到特定类型的。 未命名的内存在名称空间行中表示。 (例如UnsafeMutableRawPointerUnsafeRawPointer

未分配

未分配状态指示内存区域未分配。 在这种状态下,指针操作几乎无法进行,因此有必要分配新的内存区域来执行指针操作。

具体而言,它是实例为nil或释放时的状态。

  var指针:UnsafeMutablePointer ? 
  //取消分配先前在此指针处分配的内存块。 
  locatedPointer.deallocate() 

未初始化

在这种状态下,将分配内存区域,并且指针不会初始化。 未初始化的内存必须先进行初始化,然后才能进行读取

  • 键入指针

刚通过类型指针分配的内存或已取消初始化的内存处于未初始化状态。

  //为指定数量的Pointee类型的实例分配未初始化的内存。 
 让分配的= UnsafeMutablePointer  .allocate(容量:1) 
  //从此指针开始初始化指定数量的值。 
  initialized.deinitialize(count:1) 

capacity指示要保留多少个连续的内存区域。 内存的分配区域根据T类型(指针类型)是可变的。 这由MemoryLayout.alignmentMemoryLayout.strideMemoryLayout.stride

内存布局

类型的内存布局,描述其大小,跨度和对齐方式。

有关详细信息,请参阅Apple文档。

 struct Point { 
let x: Double
let y: Double
let isFilled: Bool
}
 // MemoryLayout.size == 17 
// MemoryLayout.stride == 24
// MemoryLayout.alignment == 8