Domanda

posso aggiungere byte a un'istanza NSMutableData facilmente utilizzando il metodo appendData, tuttavia non vedo alcun metodo simile per la rimozione dei dati? Sono affaccia qualcosa, o devo creare un nuovo oggetto e copiare solo i byte di cui ho bisogno?

È stato utile?

Soluzione

Si prega di consultare la documentazione del metodo seguente:

- (void)replaceBytesInRange:(NSRange)range withBytes:(const void *)replacementBytes length:(NSUInteger)replacementLength

Apple dice chiaramente le seguenti:

  

Se la lunghezza del campo non è uguale a   replacementLength, il ricevitore è   ridimensionata per accogliere i nuovi byte.   Qualsiasi intervallo byte passato nel ricevitore   sono spostati per ospitare il nuovo   byte. È quindi possibile passare NULL per   replacementBytes e 0 per   replacementLength eliminare byte   il ricevitore nella gamma gamma. voi   possono anche sostituire un intervallo (che potrebbe   essere di lunghezza zero) con più byte rispetto   la lunghezza del campo, che ha la   effetto di inserimento (o “sostituire alcuni   e inserire più”).

Per rimuovere 10 byte dalla fine, utilizzare:

[data setLength:[data length] - 10];

Potrebbe anche essere fatto tramite replaceBytesInRange, ma è in realtà molto più veloce, perché i byte non sono realmente rimossi. Invece solo la variabile dimensione interna è cambiata e NSMutableData si comporterà come se i byte sono stati rimossi. IOW, questo è un O (1) operazione (che significa che sarà sempre prendere altrettanto lungo per eseguire, indipendentemente dal numero di byte di rimuovere), ed è molto veloce.

Per rimuovere 10 byte dalla parte anteriore, l'uso:

[data replaceBytesInRange:NSMakeRange(0, 10) withBytes:NULL length:0];

Per rimuovere 10 byte nel mezzo (ad esempio dopo 20 byte), uso:

[data replaceBytesInRange:NSMakeRange(20, 10) withBytes:NULL length:0];

replaceBytesInRange è un'operazione O (n), però. Ciò significa che non importa quanto tempo necessario per rimuovere il 100 byte, ci vorrà il doppio del tempo per rimuovere i 200 byte e così via. E 'ancora abbastanza veloce e solo limitato dal rendimento della memoria del computer (RAM). Se si dispone di 10 MB di dati e di rimuovere 1 MB dalla parte anteriore, 9 MB vengono copiati per colmare il divario dei MB appena rimossi. Così la velocità dell'operazione dipende da quanto velocemente si può vostra mossa sistema di 9 MB di RAM da un indirizzo ad un altro. E questo è di solito abbastanza veloce, a meno che non avete a che fare con gli oggetti NSMutableData contenenti centinaia di MB.

Altri suggerimenti

Dal NSMutableData è colmato con CFMutableDataRef numero verde, è possibile utilizzare i CFDataDeleteBytes () la funzione:

NSMutableData *data = ...
CFDataDeleteBytes((CFMutableDataRef)data, CFRangeMake(3, 4));

Se i dati che si desidera rimuovere è alla fine, è possibile utilizzare

[NSMutableDataInstance setLength:[NSMutableDataInstance length] - n];

o con la sintassi obj-c 2.0

NSMutableDataInstance.length -= n;

per qualcosa di più complicato di così io consiglierei di manipolare i dati grezzi.

Ho visto che questa discussione ha la risposta, ma tuttavia questo potrebbe essere utile add. Per rimuovere tutti i byte da NSMuttableData, è possibile creare nuovi dati e copiarlo originale:

[myData setData:[NSData dataWithBytes:NULL length:0]];

Questa grande opera.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top