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