Question

Je peux ajouter octets à une instance NSMutableData facilement en utilisant la méthode de appendData, mais je ne vois pas de méthode similaire pour la suppression des données? Suis-je sur quelque chose, ou dois-je créer un nouvel objet et copier uniquement les octets nécessaires?

Était-ce utile?

La solution

S'il vous plaît voir la documentation de la méthode suivante:

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

Apple dit clairement:

  

Si la longueur de la plage est pas égal à   replacementLength, le récepteur est   redimensionnée pour accueillir les nouveaux octets.   Tout octets plage passée dans le récepteur   sont décalées pour tenir compte de la nouvelle   octets. Vous pouvez donc passer NULL pour   replacementBytes et 0 pour   replacementLength supprimer octets   le récepteur dans la plage de gamme. Toi   peut également remplacer une plage (qui pourrait   être de longueur nulle) avec plus d'octets que   la longueur de la plage, ce qui a pour   effet d'insertion (ou « remplacer une partie   et insérer plus »).

Pour supprimer 10 octets de la fin, on utilise:

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

Il pourrait également se faire via replaceBytesInRange, mais il est en fait beaucoup plus vite, parce que les octets ne sont pas vraiment supprimés. Au lieu de cela que la variable de taille interne est modifiée et NSMutableData se comportera comme si les octets ont été supprimés. OIEau, ceci est une opération O (1) (ce qui signifie qu'il sera toujours prendre aussi longtemps pour effectuer, quel que soit le nombre d'octets que vous supprimez), et il est très rapide.

Pour supprimer l'octet 10 de l'avant, à l'utilisation:

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

Pour supprimer 10 octets dans le milieu (par exemple après 20 octets), on utilise:

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

replaceBytesInRange est une opération O (n), bien que. Cela signifie que peu importe combien de temps il faut pour supprimer 100 octets, il faudra deux fois plus longtemps pour supprimer 200 octets et ainsi de suite. Il est encore assez rapide et seulement limitée par le débit de la mémoire de votre ordinateur (RAM). Si vous disposez de 10 Mo de données et que vous supprimez 1 MB de l'avant, 9 Mo sont copiés pour combler le vide du juste enlevés MB. Ainsi, la vitesse de l'opération dépend de quelle vitesse votre déménagement système 9 Mo de RAM d'une adresse à l'autre. Et cela est généralement assez vite, à moins que vous traitez avec des objets NSMutableData contenant des centaines de MB.

Autres conseils

Depuis NSMutableData est comblé sans frais avec CFMutableDataRef, vous pouvez utiliser la fonction CFDataDeleteBytes ():

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

Si les données que vous souhaitez supprimer est à la fin, vous pouvez utiliser

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

ou avec la syntaxe obj-c 2.0

NSMutableDataInstance.length -= n;

pour quelque chose de plus compliqué que je vous recommande de manipuler les données brutes.

Je vois que ce fil a la réponse, mais néanmoins cela pourrait être utile ajouter. Pour supprimer tous les octets de NSMuttableData, vous pouvez créer de nouvelles données et le copier à l'original:

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

Cela fonctionne très bien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top