Frage

Ich kann eine nsmutabledabledata -Instanz einfach mit der NSMutabledata -Instanz hinzufügen appendData Die Methode sehe jedoch keine ähnliche Methode zum Entfernen von Daten? Übersehen ich etwas oder muss ich ein neues Objekt erstellen und nur die Bytes kopieren, die ich brauche?

War es hilfreich?

Lösung

Bitte beachten Sie die Dokumentation der folgenden Methode:

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

Apple sagt eindeutig Folgendes:

Wenn die Länge des Bereichs nicht gleich der Ersatzlänge ist, wird der Empfänger geändert, um die neuen Bytes aufzunehmen. Alle Bytes, die im Empfänger hinter sich haben, werden verschoben, um die neuen Bytes aufzunehmen. Sie können daher Null für ErsatzBytes und 0 für Ersatzlängen zum Löschen von Bytes im Empfänger im Bereich Bereich übergeben. Sie können auch einen Bereich (der möglicherweise null Länge sein kann) durch mehr Bytes als die Länge des Bereichs ersetzen, der den Einfluss des Einsetzens hat (oder „etwas ersetzen und mehr einfügen“).

Um 10 Byte vom Ende zu entfernen, verwenden Sie:

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

Es könnte auch über Ersatzbytesinrange erfolgen, aber es ist in der Tat viel schneller, da die Bytes nicht wirklich entfernt werden. Stattdessen wird nur die interne Größenvariable geändert und NSMutabledata wird sich so verhalten, als wären die Bytes entfernt. Iow, dies ist eine O (1) -Operation (das bedeutet, dass die Leistung immer gleich lange dauert, unabhängig davon, wie viele Bytes Sie entfernen), und es ist sehr schnell.

Um 10 Byte von vorne zu entfernen, verwenden Sie:

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

Um 10 Bytes in der Mitte zu entfernen (z. B. nach 20 Bytes), verwenden Sie:

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

ErsatzBytesinrange ist jedoch eine O (N) -Operation. Das heißt, egal wie lange es dauert, bis 100 Byte entfernen, es dauert doppelt so lange, bis 200 Bytes und so weiter entfernt werden. Es ist immer noch ziemlich schnell und nur durch den Durchsatz des Speichers Ihres Computers (RAM) eingeschränkt. Wenn Sie 10 MB Daten haben und 1 MB von vorne entfernen, werden 9 MB kopiert, um die Lücke des gerade entferntem MB zu füllen. Die Geschwindigkeit des Betriebs hängt also davon ab, wie schnell Ihr System 9 MB RAM von einer Adresse zu einer anderen verschieben kann. Und dies ist normalerweise schnell genug, es sei denn, Sie beschäftigen sich mit NSMutabledata -Objekten, die Hunderte von MB enthalten.

Andere Tipps

Es sollte ein Feature-Event-Empfänger geben, der den Inhaltstyp programmgesteuert in die Bibliothek hinzufügt. Bitte haben Sie einen Blick, wenn es irgendwelche gibt

Wenn die Daten, die Sie entfernen möchten, am Ende sind, können Sie verwenden

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

oder mit der OBJ-C 2.0-Syntax

NSMutableDataInstance.length -= n;

Für etwas komplizierteres als das empfehlen würde ich empfehlen, die Rohdaten zu manipulieren.

Ich sehe, dass dieser Thread die Antwort hat, aber dennoch könnte dies wertvoll sein. Um alle Bytes von NSmutTabledata zu entfernen, können Sie neue Daten erstellen und nach Original kopieren:

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

Das funktioniert großartig.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top