如何正确处理UnsafeMutablePointer

时间:2016-07-04 01:35:47

标签: c swift memory core-audio

我有点困惑。什么时候我必须免费拨打电话和/ dealloc?我正在研究一个学习核心音频的简短代码片段。我想如果我拨打UnsafeMutablePointer<Type>.alloc(size),那么我应该致电destroy&amp; dealloc。 但是,如果我使用malloc()calloc(),我应该致电free()

在这个来自Learning Core Audio的示例中,以下代码片段让我想知道:

var asbds = UnsafeMutablePointer<AudioStreamBasicDescription>.alloc(Int(infoSize))
audioErr = AudioFileGetGlobalInfo(kAudioFileGlobalInfo_AvailableStreamDescriptionsForFormat,
                              UInt32(sizeof(fileTypeAndFormat.dynamicType)), &fileTypeAndFormat,
                              &infoSize, asbds)

我在这里使用alloc。要释放内存free,请调用。

free(asbds)

但为什么不呢

asbds.destroy(Int(infoSize))
asbds.dealloc(Int(infoSize))

我希望遵守规则。

我会感激任何帮助,因为这让我头晕目眩。文档说我负责销毁和dealloc,以便部分清楚,但以哪种方式?

1 个答案:

答案 0 :(得分:1)

请参阅UnsafeMutablePointer Structure Reference

  

指针可以处于以下状态之一:

     
      
  • 未分配内存(例如,指针为空,或先前已释放内存)。

  •   
  • 已分配内存,但尚未初始化值。

  •   
  • 分配内存并初始化值。

  •   

当分配和初始化&#34;时,您可以安全地使用指向的区域。 因此,如果您想正确使用Swift UnsafeMutablePointer,则在使用前需要2个步骤,使用后需要2个步骤。

(1)分配:alloc(_:)

(2)启动:initialize...()

您可以在此安全地使用已分配和初始化的区域。

(3)取消初始化:destroy(_:)

(4)解除分配:dealloc(_:)

为什么您可以将free()用于alloc(_:)内存,因为Swift在malloc(_:)的当前实现中使用alloc(_:)。因此,使用free意味着您的应用程序依赖于Swift运行时的当前实现。

因此,使用UnsafeMutablePointer有点困难和恼人。您应该考虑将数组作为指针传递。 在你的情况下,你可以这样写:

    let elementCount = Int(infoSize) / strideof(AudioStreamBasicDescription)
    var asbds: [AudioStreamBasicDescription] = Array(count: elementCount, repeatedValue: AudioStreamBasicDescription())
    audioErr = AudioFileGetGlobalInfo(kAudioFileGlobalInfo_AvailableStreamDescriptionsForFormat,
                                  UInt32(sizeof(fileTypeAndFormat.dynamicType)), &fileTypeAndFormat,
                                  &infoSize, &asbds)

(我认为即使使用elementCount,我也应该使用此UnsafeMutablePointeralloc(_:)dealloc(_:)使用&#34;元素数量&#34;,而不是&# 34;字节大小&#34;。)