我正在努力(遇到内存错误,或者显然没有正确地释放内存)试图创建一个CMBlockBufferRef,其中填充了来自现有NSData(或NSMutableData)的数据。
我对复制数据的解决方案感到满意,但理想情况下,我将寻找一种使用基础NSData字节并对NSData对象保持强烈引用的解决方案,直到CMBlockBuffer被释放为止。
最佳答案
仅对于引用NSData
的只读缓冲区(当然,没有复制),我刚刚找到了一种实现方法。
static void releaseNSData(void *o, void *block, size_t size)
{
NSData *data = (__bridge_transfer NSData*) o;
data = nil; // Assuming ARC is enabled
}
OSStatus createReadonlyBlockBuffer(CMBlockBufferRef *result, NSData *data)
{
CMBlockBufferCustomBlockSource blockSource =
{
.version = kCMBlockBufferCustomBlockSourceVersion,
.AllocateBlock = NULL,
.FreeBlock = &releaseNSData,
.refCon = (__bridge_retained void*) data,
};
return CMBlockBufferCreateWithMemoryBlock(NULL, (uint8_t*) data.bytes, data.length, NULL, &blockSource, 0, data.length, 0, result);
}
关于ios - 如何从NSData创建CMBlockBufferRef,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26158253/