我有点困惑。什么时候我必须拨打免费电话,什么时候销毁/取消分配电话?我正在研究一个简短的代码片段,以学习核心音频。我以为如果我调用UnsafeMutablePointer<Type>.alloc(size),那么我应该调用destroydealloc
但是,如果我使用malloc()calloc(),我应该叫free()

在来自“学习核心音频”的此示例中,以下代码片段使我感到奇怪:

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))

我希望遵循规则。

我将不胜感激,因为这会使我转头。文档说我负责销毁和释放,以便使这一部分清晰可见,但是用哪种方式呢?

最佳答案

参见UnsafeMutablePointer Structure Reference



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

(1)分配:alloc(_:)

(2)初始化:initialize...()
您可以在此处安全地使用分配和初始化的区域。

(3)取消初始化:destroy(_:)
(4)解除分配:dealloc(_:)
以及为什么可以将free()用于alloc(_:) ed内存,这是因为Swift在当前malloc(_:)的实现中使用alloc(_:)。因此,使用免费意味着您的应用程序依赖于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(_:)使用“元素数”,而不是“字节大小”。)

关于c - 如何正确处理UnsafeMutablePointer,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38175870/

10-12 19:20