我想知道 Objective-C 中音频数据最适用的缓冲区实现类型是什么。我在 iPhone 上处理音频数据,在录制或播放时对音频数据进行一些直接数据操作/DSP,因此性能很重要。我从事 iPhone 开发已有几个月了。目前我正在处理元素类型 SInt16 或 Float32 的 c 数组,但我正在寻找更好的东西。
据我所知,指针迭代的 c 数组的性能在 Objective-C 环境中是无与伦比的。然而,指针算术和 C 数组很容易出错。您始终必须确保不会超出其范围访问数组。如果这样做,您不会立即收到运行时错误。并且您必须手动确保正确分配和释放数组。
因此,我正在寻找替代方案。有哪些高性能替代方案? Objective-C 中是否有类似于 C++ 风格的 std::vector 的东西?
类似我的意思是:
- 良好的表现
- 可通过基于指针/迭代器的循环进行迭代
- 没有将 Float32 或 SInt16 等基本数据类型装箱/拆箱到 Objective-C 对象中的开销(顺便说一句,objective-c 中“基本数据类型”的正确用词是什么?)
- 边界检查
- 可以将其他列表或数组的 block 复制/读取/写入我的搜索列表实现
- 包含内存管理
我已经搜索并阅读了很多内容,当然 NSData
和 NSMutableArray
是提到的解决方案之一。然而,由于基本数据类型的装箱/拆箱的开销,它们不会使处理成本加倍吗?代码看起来非常丑陋,就像一个简单的“设置”操作变成了一些名为 replaceObjectAtIndex:withObject:
的恐龙,这并不是我关心的,但它仍然微妙地让我认为这个类不是为我。
最佳答案
NSMutableData
满足了您的要求之一,因为它将 Objective-C 内存管理语义引入了普通 C 缓冲区。你可以这样做:
NSMutableData* data = [NSMutableData dataWithLength: sizeof(Float32) * numberOfFloats];
Float32* cFloatArray = (Float32*)[data mutableBytes];
然后您可以将 cFloatArray
视为标准 C 数组并使用指针迭代。当 NSMutableData 对象被释放时,支持它的内存将被释放。它不提供边界检查,但它提供内存管理帮助,同时保留 C 数组的性能。
此外,如果您需要工具帮助解决边界检查问题,请阅读 Xcode 的 Malloc Scribble、Malloc Guard Edges 和 Guard Malloc 选项。这些将使运行时对边界问题更加敏感。在生产中没有用,但有助于解决开发过程中的问题。
关于ios - Objective-C 中的高性能缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16356486/