3
试图创建一个充满来自现有NSData(或NSMutableData)的数据的CMBlockBufferRef,我挣扎着(获取内存错误,或显然不正确地释放内存)。 我会很高兴能够复制数据的解决方案,但理想情况下,我会查看将使用底层NSData字节的解决方案,并保留对NSData对象的强引用,直到CMBlockBuffer被释放。如何从NSData创建CMBlockBufferRef
试图创建一个充满来自现有NSData(或NSMutableData)的数据的CMBlockBufferRef,我挣扎着(获取内存错误,或显然不正确地释放内存)。 我会很高兴能够复制数据的解决方案,但理想情况下,我会查看将使用底层NSData字节的解决方案,并保留对NSData对象的强引用,直到CMBlockBuffer被释放。如何从NSData创建CMBlockBufferRef
只适用于只读缓冲区,指的是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);
}
这是代码每个人都应该使用,以免ARC dealloc的比赛,因为CMBlockBufferCreateWithMemoryBlock只是引用到NSData的,而不是保存对象的字节。真棒! – 2017-02-07 19:31:11