From this link:Как вернуть действие - [NSMutableData appendBytes: length:]?
- (void)process {
_isProcessing = YES;
int amountInBuffer = 0;
int framesRead = 0;
do {
if (_data.length >= BUFFER_SIZE) {
framesRead = 1;
break;
}
if (_shouldSeek) {
[_decoder seek:seekFrame];
_shouldSeek = NO;
}
int framesToRead = CHUNK_SIZE/bytesPerFrame;
framesRead = [_decoder readAudio:inputBuffer frames:framesToRead];
amountInBuffer = (framesRead * bytesPerFrame);
dispatch_sync([ORGMQueues lock_queue], ^{
[_data appendBytes:inputBuffer length:amountInBuffer];
});
} while (framesRead > 0);
if (framesRead <= 0) {
[self setEndOfInput:YES];
}
_isProcessing = NO;
}
Я полагаю, что bytesPerFrame
имеет постоянное значение.
So void *inputBuffer
используется, чтобы получить данные по кускам и «скомпилировать» их в объект NSMutableData
. Как вернуть это действие для преобразования этого объекта в массив из void *
блоков данных (включая управление памятью, если это необходимо)?
Есть некоторые подобные вопросы, но:
1) они просто конвертировать NSMutableData
в void *
, не void *
массива;
2) они не учитывают управление памятью.
Вы не можете преобразовать 'NSMutableData' к' аннулируются * 'без учета для управления памятью: либо сделать копию с' malloc', или вы полагаетесь на внутреннем хранилище вашей 'NSMutableData', но в обоих случаях вы должны явно решить, кто« владеет »памятью. – dasblinkenlight
хорошо, не могли бы вы привести пример? –
Ответ зависит от того, как вы хотите управлять памятью: если вы хотите, чтобы объект 'NSMutableData' был освобожден и сохранил ваш массив указателей' void * ', есть одно решение; если вы в порядке с использованием вашего массива указателей 'void * ', пока объект' NSMutableData' остается, есть другое (гораздо более простое) решение. – dasblinkenlight