New NSData mit einer Reichweite von alten NSData Aufrechterhaltung bytes
Ich habe eine ziemlich große NSData (oder NSMutableData wenn nötig) - Objekt, die ich will nehmen Sie ein kleines Stück aus und überlassen Sie den rest. Da bin ich auf das arbeiten mit großen Mengen von NSData bytes, ich will nicht, um einen großen zu kopieren, sondern einfach nur abschneiden des vorhandenen bytes. Grundsätzlich:
- NSData *Quelle: < ein paar bytes, die ich will
verwerfen > + < big chunk bytes I
wollen, halten > - NSData *Ziel: < big
Stück von bytes, die ich behalten will >
Gibt es abschneiden Methoden in NSMutableData, aber Sie nur abgestutzten Ende, während ich die abgeschnitten werden soll, den Anfang. Meine Gedanken sind dazu mit den Methoden:
Beachten Sie, dass ich das falsche (kopieren) - Methode in der original-posting. Ich habe bearbeitet und repariert es
- (const void *)bytes
und
- initWithBytesNoCopy:length:freeWhenDone:
Jedoch, ich versuche, herauszufinden, wie um Speicher zu verwalten. Ich vermute, der Prozess wird sein, wie diese (die ich aufgegeben habe ????s, wo ich nicht weiß, was zu tun ist):
//Get bytes
const unsigned char *bytes = (const unsigned char *)[source bytes];
//Offset the start
bytes += myStart;
//Somehow (m)alloc the memory which will be freed up in the following step
?????
//Release the source, now that I've allocated the bytes
[source release];
//Create a new data, recycling the bytes so they don't have to be copied
NSData destination = [[NSData alloc]
initWithBytesNoCopy:bytes
length:myLength
freeWhenDone:YES];
Danke für die Hilfe!
InformationsquelleAutor umop | 2010-04-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist das, was Sie wollen?
Ich weiß, Sie sagte "ich will nicht, um eine große Kopie", aber das nur macht das gleiche, kopieren Sie Taten mit
getBytes:length:
in Ihrem Beispiel, so kann dies okay für Sie.Gibt es auch
replaceBytesInRange:withBytes:length:
, die Sie möglicherweise verwenden, wie diese:Aber die doc ' s sagen nicht, wie die Methode funktioniert (keine Leistungsdaten), und
source
werden muss, NSMutableData.Ich erkannte, dass die getBytes, dass ich verwendet wurde, war eine Kopie zu erstellen. Ich dachte, es war eines der wenigen Zugriffsmethoden für (const void *)bytes. Ich bearbeitete meinen code entsprechend. Sorry für die Verwirrung. Und in Bezug auf Ihre Antwort, leider Nein. Ich bin versucht zu recyceln, werden die Daten im Objekt selbst für die Verwendung in einem anderen Objekt, dann entsorgen Sie das referenzierende Objekt.
InformationsquelleAutor alltom
je nach Kontext, die Lösungen können unterschiedlich sein. Ich gehe davon aus, dass Sie eine Methode, die zurückkehren würde, einen autoreleased
NSData
- Objekt mit dem angegebenen Bereich:Natürlich, können Sie machen es zu einer Klasse-Methode und lege es in eine Art "utils" - Klasse, oder erstellen Sie eine Erweiterung über NSData...
zu ersetzen??????? Teil Ihrer post, die Sie verwenden können, smth like this:
memcpy(myNewByteArrayOfNewSize, bytes, [source length] - myStart);
..... Ich hoffe, dass ich nicht Durcheinander, jeder der IndizesAber das wird eine Kopie machen. Ich bin auf der Suche, um das Recycling der Daten-chunk verweist bytes lieber als es zu kopieren. Grundsätzlich, ich brauche, um irgendwie zu verhindern, dass der chunk mallocated, wenn NSData *Quelle zwangsläufig befreit.
ich denke, Sie sind aus Glück in diesem Fall :(... afaik, sobald ein block einer bestimmten Größe ist malloc ' ed, können Sie nicht frei, nur ein Stück davon und die Belegung der rest wie ein neuer block. Ich würde überdenken, die Art und Weise Sie befassen sich mit den Inhalten, aber, da wenn dabei ein memcpy in ein Stück, dass die Daten "zu viel" sind, sind Sie wahrscheinlich drücken der memory-limits sowieso, das ist keine gute Sache.
InformationsquelleAutor Nick
Wenn Sie vermeiden möchten, kopieren Speicher-Blöcke, die Sie verwenden können, die
dataWithBytesNoCopy
zu halten, die alten Puffer mit einem bestimmten offset. In diesem Beispiel haben wir "entfernen" die ersten 2 bytes:Zuliebe, Beispiel Einfachheit, Grenz-check wird übersprungen, bitte fügen Sie es, wie es bequem für Sie ist.
Verfügbar in iOS 2.0 und höher.
InformationsquelleAutor Ivan Marinov
Gibt es auch eine
NSData
Methode-[subdataWithRange:(NSRange)range]
könnte den trick tun. Ich habe keine Ahnung, wie die performance aussieht (ich würde vorstellen, es muss eine Kopie oder zwei, aber ich weiß es nicht sicher). Es kann verwendet werden, wie:InformationsquelleAutor Joel Fischer