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,以便部分清晰,但是以哪种方式?
指针可以处于以下状态之一:
内存未分配(例如,指针为空,或者内存先前已被释放)。
内存已分配,但值尚未初始化。
分配内存并初始化值。
当“分配和初始化”时,您可以安全地使用指向的区域。所以,如果你想正确使用 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(_:)使用“元素数量”而不是“字节大小”时也应该使用它。)
| 归档时间: |
|
| 查看次数: |
819 次 |
| 最近记录: |