2014-10-02 3 views
3

Я борюсь (получая ошибки памяти или, по-видимому, не правильно освобождая память), пытаясь создать CMBlockBufferRef, заполненный данными из существующих NSData (или NSMutableData). Я был бы доволен решением, которое копирует данные, но в идеале я бы посмотрел на решение, которое будет использовать базовые байты NSData и будет содержать сильную ссылку на объект NSData до тех пор, пока CMBlockBuffer не будет освобожден.Как создать CMBlockBufferRef из NSData

ответ

3

Только для буфера только для чтения, ссылающегося на 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); 
} 
+0

Это код, каждый должен использовать для того, чтобы избежать ARC dealloc гонок, так как CMBlockBufferCreateWithMemoryBlock только ссылки на объекты NSData байт без сохранения его. Потрясающие!! –

Смежные вопросы