2013-05-27 15 views
6

Wenn ich eine NSData * von einer API habe und diese in einen std :: vector für eine andere API umwandeln muss, gibt es eine Möglichkeit, dies sicher ohne zu kopieren die Bytes in den NSData (angenommen, eine sehr große NSData *)?NSData * zu std :: vector <unsigned char> Ohne Kopie

+0

Sie könnten in der Lage sein, einen benutzerdefinierten Zuordner (den zweiten Vorlagenparameter von 'std :: vector') zu erstellen, der das tut, aber ich denke nicht, dass es etwas Out-of-the-Box gibt, das das für Sie tun würde . –

Antwort

4

Keine schnelle Lösung, die in den Sinn kommt, nein.

Wenn Sie das NSData Objekt erstellen (anstatt sie durch eine andere API zurückgeschickt werden), könnten Sie Subklassen NSData und/oder NSMutableData berücksichtigen, wenn Sie wirklich die Kopie vermeiden müssen - dann könnte man den Speicher zugreifen (std :: Vektor) direkt.

Sie können auch durch die Schaffung der Daten mit ‚Ihr‘ Zuweisung um es in einigen Fällen zu schleichen in der Lage:

NSData * data([[NSData alloc] 
       initWithBytesNoCopy:vector.data() 
           length:vector.size() 
         freeWhenDone:false]); 

natürlich, müssen Sie den Vektor stellen Sie sicher, nicht geändert wird (oder deren Träger Speicher neu zugewiesen), bevor das Objekt NSData freigegeben wird.

Manchmal müssen Sie auch den Parametertyp ändern, so dass es kein std::vector ist. Ein kleiner Container, der ein NSData Member und eine vektorähnliche Schnittstelle, einen Iterator oder ein begin + end hat, kann angemessen sein, während andere Auflistungsarten berücksichtigt werden.

1

Ich weiß nicht genug über stl oder cpp, aber wenn man einen Vektor aus einem Hohlraum konstruieren * buffer, dann sollten Sie in der Lage sein, mit:

void * buffer = [data bytes]; 
size_t len = [data length]; 

im Auge zu behalten, dass die Daten des Besitzer puffern, damit Sie es nicht freigeben können.