From this link:Comment annuler une action - [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;
}
Je suppose que bytesPerFrame
a une valeur constante.
Donc void *inputBuffer
est utilisé pour obtenir des données par morceaux et les "compiler" en objet NSMutableData
. Comment annuler cette action pour convertir cet objet en tableau de blocs de données void *
(y compris la gestion de la mémoire si nécessaire)?
Il y a des questions similaires mais:
1) ils convertissent juste NSMutableData
en void *
, pas un tableau void *
;
2) ils ne prennent pas en compte la gestion de la mémoire.
Vous ne pouvez pas convertir 'NSMutableData' un' vide * 'sans tenir compte de la gestion de la mémoire: soit vous faites une copie avec' malloc', ou vous comptez sur le stockage interne de votre NSMutableData, mais dans les deux cas, vous devez décider explicitement qui possède la mémoire. – dasblinkenlight
ok, pourriez-vous écrire un exemple? –
La réponse dépend de la façon dont vous voulez gérer la mémoire: si vous souhaitez laisser l'objet 'NSMutableData' se libérer et conserver votre tableau de pointeurs' void * ', il y a une solution; Si vous êtes d'accord pour utiliser votre tableau de pointeurs "void *" tant que l'objet "NSMutableData" reste, il existe une autre solution (beaucoup plus simple). – dasblinkenlight