如何正确处理UnsafeMutablePointer

eno*_*tia 7 c memory core-audio swift

我有点困惑.什么时候我必须免费拨打电话和/ dealloc?我正在研究一个学习核心音频的简短代码片段.我想如果我打电话 UnsafeMutablePointer<Type>.alloc(size)那么我应该打电话给destroy&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)
Run Code Online (Sandbox Code Playgroud)

我在这里使用alloc.free调用释放内存.

free(asbds)
Run Code Online (Sandbox Code Playgroud)

但为什么不呢

asbds.destroy(Int(infoSize))
asbds.dealloc(Int(infoSize))
Run Code Online (Sandbox Code Playgroud)

我希望遵循规则.

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

OOP*_*Per 4

请参阅UnsafeMutablePointer 结构参考

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

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

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

  • 分配内存并初始化值。

当“分配和初始化”时,您可以安全地使用指向的区域。所以,如果你想正确使用 Swift UnsafeMutablePointer,你需要在使用前 2 个步骤和使用后 2 个步骤。

(1) 分配:alloc(_:)

(2) 初始化:initialize...()

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

(3) 反初始化:destroy(_:)

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


为什么可以使用free()for alloc(_:)ed 内存,那是因为 Swiftmalloc(_:)在当前的实现中使用了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)
Run Code Online (Sandbox Code Playgroud)

elementCount(我认为即使在使用UnsafeMutablePointer.alloc(_:)dealloc(_:)使用“元素数量”而不是“字节大小”时也应该使用它。)