Stockage et restauration de std :: vector à partir de NSData

J’essaye de stocker std :: vector à NSData et retour directement. Lors de ma première tentative, j’ai converti chaque point en NSValue et les ai stockés avec NSKeyedUnarchiver, ce qui semble terriblement inefficace. Mon dataset de test nécessitait 64 Mo de texte lisible par l’homme (avec NSKeyedUnarchiver), par opposition à la conversion de chaque vecteur std: en NSData, les fichiers stockés résultants sont beaucoup plus raisonnables. Je fais comme suit pour stocker les données:

typedef std::vector CGContour; typedef std::vector<std::vector> CGContours; static CGContours contoursVector; contoursVector = CGContours(1024); //Populated with CGContours that are populated with CGPoints datatypes above //doing the following in a for loop, just showing record 0 for brevity NSData *contourData([[NSData alloc] initWithBytesNoCopy: contoursVector[0].data() length: contoursVector[0].size() freeWhenDone:false]); 

Je suis capable de récupérer le tampon:

  const void *buffer = [contourData bytes]; size_t len = [contourData length]; 

Cependant, je suis incapable de comprendre comment peupler un std :: vector avec le pointeur de mémoire tampon de mémoire tampon constante. J’ai essayé d’utiliser toutes les combinaisons possibles de pointeur et de déréférencement auxquelles je peux penser – la seule chose que je peux obtenir pour comstackr est la suivante:

  contoursVector[0] = *(CGContour *)[contourData bytes]; 

Si j’inspecte le vecteur des points CGP, ils sont 0,0, il est donc clair que quelque chose ne va pas.

EDIT: après avoir mis en œuvre la réponse suggérée, parfois cela fonctionne, parfois je reçois EXC_BAD_ACCESS. Voici la trace arrière pertinente:

 * thread #17: tid = 0x11bf7d4, 0x0000000111607551 libsystem_platform.dylib`_platform_memmove$VARIANT$Ivybridge + 49, queue = 'NSOperationQueue 0x7fa298f51000 :: NSOperation 0x7fa29f3251f0 (QOS: UTILITY)', stop reason = EXC_BAD_ACCESS (code=1, address=0x126e27000) frame #0: 0x0000000111607551 libsystem_platform.dylib`_platform_memmove$VARIANT$Ivybridge + 49 frame #1: 0x000000010d01890f Foundation`NSCopyMemoryPages + 57 frame #2: 0x000000010cf9b737 Foundation`_NSDataCreateVMDispatchData + 103 frame #3: 0x000000010cf99cf2 Foundation`-[_NSPlaceholderData initWithBytes:length:copy:deallocator:] + 230 frame #4: 0x000000010cfa5902 Foundation`-[NSData(NSData) initWithBytes:length:] + 37 * frame #5: 0x000000010cfeabfb Foundation`+[NSData(NSData) dataWithBytes:length:] + 54 frame #6: 0x000000010c5c998a TDTPhotoLib`storePointData() + 682 at TDTContourImage.mm:562 

Ce qui est étrange, c’est que les contours et le contour converti en données semblent tous les deux valables dans le débogueur et le problème semble être intermittent (parfois, cela fonctionne parfois mais cela ne fonctionne pas, mais ne peut pas dire si quelque chose peut être différent)

EDIT 2:

Je suis capable d’itérer sur chaque point, mais il se bloque sur la ligne NSData.

 NSMutableArray *groupedPointsArrayMain = [NSMutableArray new]; for(const CGContour &contour : contoursVector) { if (contour.size() > 0) { // I am able to iterate over every point and store them this way NSMutableArray *contourPoints = [NSMutableArray arrayWithCapacity:contour.size()]; for(const CGPoint &point : contour) { [contourPoints addObject:[NSValue valueWithCGPoint:point]]; } //When it crashes, it will crash on this line //despite it successfully walking over each point //in the code directly above NSData *data = [NSData dataWithBytes: contour.data() length: (contour.size() * cgContourSize)]; [groupedPointsArrayMain addObject:data]; } } 

Quelque chose comme ça devrait faire l’affaire. Veuillez noter que je n’ai pas essayé de comstackr ce code car je suis sous Linux atm.

 typedef std::vector CGContour; typedef std::vector CGContours; const size_t contourSize = sizeof(CGContour); NSMutableArray *datas = [NSMutableArray new]; { // store CGContours contours(1024); for(const CGContour &contour : contours) { NSData *data = [NSData dataWithBytes: contour.data() length: contour.size() * contourSize]; [datas addObject:data] } } { // restore CGContours contours; for(NSData *data in datas) { const size_t count = [data length] / contourSize; CGPoint *first = (CGPoint *)[data bytes]; CGPoint *last = first + count; contours.emplace_back(first, last); } }