Pregunta

Puedo agregar bytes a una instancia de NSMUTABLEDATA fácilmente usando el appendData Método, sin embargo, no veo ningún método similar para eliminar datos? ¿Estoy pasando por alto algo, o necesito crear un objeto nuevo y copiar solo los bytes que necesito?

¿Fue útil?

Solución

Consulte la documentación del siguiente método:

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

Apple claramente dice lo siguiente:

Si la longitud del rango no es igual a la longitud de reemplazo, el receptor se redimensiona para acomodar los nuevos bytes. Cualquier rango pasado de bytes en el receptor se desplaza para acomodar los nuevos bytes. Por lo tanto, puede pasar NULL para ReemplaationBytes y 0 para la longitud de reemplazo para eliminar bytes en el receptor en el rango de rango. También puede reemplazar un rango (que podría ser de longitud cero) con más bytes que la longitud del rango, que tiene el efecto de la inserción (o "reemplazar algunos e insertar más").

Para eliminar 10 bytes desde el final, use:

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

También se puede hacer a través de ReemplazarBytesInRange, pero de hecho es mucho más rápido, porque los bytes no se eliminan realmente. En su lugar, solo se cambia la variable de tamaño interno y NSMUTABLEDATA se comportará como si se eliminaran los bytes. Iow, esta es una operación O (1) (eso significa que siempre tardará en realizar igualmente mucho tiempo, independientemente de cuántos bytes elimine), y es muy rápido.

Para eliminar 10 bytes del frente, use:

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

Para eliminar 10 bytes en el medio (por ejemplo, después de 20 bytes), use:

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

Sin embargo, reemplazarBytesInRange es una operación O (n). Eso significa que no importa cuánto tiempo lleva eliminar 100 bytes, tardará el doble en eliminar 200 bytes, etc. Todavía es bastante rápido y solo limitado por el rendimiento de la memoria de su computadora (RAM). Si tiene 10 MB de datos y elimina 1 MB desde el frente, se copian 9 MB para llenar el espacio del MB recién eliminado. Por lo tanto, la velocidad de la operación depende de qué tan rápido puede su sistema mover 9 MB de RAM de una dirección a otra. Y esto suele ser lo suficientemente rápido, a menos que se trate de objetos NSMUTABLEDATA que contienen cientos de MB.

Otros consejos

Debería haber un receptor de eventos de características que agregará el tipo de contenido programáticamente a la biblioteca, tenga un vistazo si hay alguna

Si los datos que desea eliminar están al final, puede usar

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

o con la sintaxis OBJ-C 2.0

NSMutableDataInstance.length -= n;

Para cualquier cosa más complicada que eso, recomendaría manipular los datos sin procesar.

Veo que este hilo tiene la respuesta, pero sin embargo, esto podría ser valioso. Para eliminar todos los bytes de NSMUTTABLEDATA, puede crear nuevos datos y copiarlos al original:

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

Esto funciona muy bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top