如何正确处理 UnsafeMutablePointer
Posted
技术标签:
【中文标题】如何正确处理 UnsafeMutablePointer【英文标题】:How to handle UnsafeMutablePointer correctly 【发布时间】:2016-07-04 01:35:47 【问题描述】:我有点困惑。我什么时候必须调用 free 以及何时销毁/dealloc?我正在编写一个短代码 sn-p 学习核心音频。我想如果我打电话给UnsafeMutablePointer<Type>.alloc(size)
,那么我应该打电话给destroy
和dealloc
。
但如果我使用malloc()
或calloc()
我应该打电话给free()
。
在学习核心音频的这个例子中,下面的代码 sn-p 让我想知道:
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))
我希望遵守规则。
我会很感激任何帮助,因为这让我头晕目眩。文档说我负责销毁和解除分配,以便清楚地知道这部分,但是以哪种方式?
【问题讨论】:
【参考方案1】:请参阅UnsafeMutablePointer Structure Reference。
指针可以处于以下状态之一:
内存未分配(例如,指针为空,或者内存之前已被释放)。
内存已分配,但值尚未初始化。
分配内存并初始化值。
您可以在“分配和初始化”时安全地使用指向区域。
所以,如果你想正确使用Swift的UnsafeMutablePointer
,你需要在使用前2步,使用后2步。
(1) 分配:alloc(_:)
.
(2) 初始化:initialize...()
您可以在这里安全地使用分配和初始化的区域。
(3) 取消初始化:destroy(_:)
(4) 解除分配:dealloc(_:)
以及为什么你可以将free()
用于alloc(_:)
ed 内存,那是因为Swift 在alloc(_:)
的当前实现中使用了malloc(_:)
。因此,使用 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)
(我认为即使使用UnsafeMutablePointer
,你也应该使用这个elementCount
。alloc(_:)
或dealloc(_:)
使用“元素数量”,而不是“字节大小”。)
【讨论】:
非常感谢。这有很大帮助。我真的很喜欢数组方法,它让事情变得更加快捷。但是要为我清除free()
part。现在打电话free
或destroy
和dealloc
没有区别?我理解正确吗?因为alloc
在幕后打电话给malloc
。以上是关于如何正确处理 UnsafeMutablePointer的主要内容,如果未能解决你的问题,请参考以下文章