Pergunta

Eu posso adicionar bytes a uma instância nsmutabledata facilmente usando o appendData Método, no entanto, não vejo método semelhante para remover dados? Estou com vista para algo, ou preciso criar um novo objeto e copiar apenas os bytes de que preciso?

Foi útil?

Solução

Consulte a documentação do seguinte método:

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

A Apple diz claramente o seguinte:

Se o comprimento da faixa não for igual ao comprimento de reposição, o receptor será redimensionado para acomodar os novos bytes. Quaisquer bytes anteriores no receptor são deslocados para acomodar os novos bytes. Portanto, você pode passar nulo para substituição e 0 para o comprimento de reposição para excluir bytes no receptor no intervalo. Você também pode substituir um intervalo (que pode ter um comprimento de zero) por mais bytes do que o comprimento do intervalo, que tem o efeito da inserção (ou "substitua alguns e insira mais").

Para remover 10 byte do final, use:

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

Isso também pode ser feito via SubstituyTesinRange, mas é de fato muito mais rápido, porque os bytes não são realmente removidos. Em vez disso, apenas a variável de tamanho interna é alterada e o NSMutabledata se comportará como se os bytes fossem removidos. Iow, esta é uma operação O (1) (isso significa que sempre levará igualmente longas para executar, independentemente de quantos bytes você remove), e é muito rápido.

Para remover 10 byte de frente, use:

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

Para remover 10 bytes no meio (por exemplo, após 20 bytes), use:

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

O substituto de reposição é uma operação O (n), no entanto. Isso significa que não importa quanto tempo leva para remover 100 byte, levará o dobro do tempo para remover 200 bytes e assim por diante. Ainda é muito rápido e apenas limitado pela taxa de transferência da memória do seu computador (RAM). Se você tiver 10 MB de dados e remover 1 MB da frente, 9 MB serão copiados para preencher a lacuna do MB recém -removido. Portanto, a velocidade da operação depende da rapidez com que seu sistema pode mover 9 MB de RAM de um endereço para outro. E isso geralmente é rápido o suficiente, a menos que você lide com objetos NSMutableData contendo centenas de MB.

Outras dicas

Deve haver receptor de evento de recursos que adicionará o tipo de conteúdo programaticamente à biblioteca, por favor, dê uma olhada se houver qualquer

Se os dados que você deseja remover estiver no final, você pode usar

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

ou com a sintaxe OBJ-C 2.0

NSMutableDataInstance.length -= n;

Para qualquer coisa mais complicada do que isso, eu recomendaria manipular os dados brutos.

Vejo que este tópico tem a resposta, mas, no entanto, isso pode ser valioso adicionar. Para remover todos os bytes do NSMuttabledata, você pode criar novos dados e copiá -los para o original:

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

Isso funciona muito bem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top