2010-06-11 17 views
0

J'ai malloc'd tout un tas de données dans une instance NSOperation. J'ai un pointeur:Cacao & cacao Touch. Comment créer un objet NSData à partir d'un pointeur ole simple?

data = malloc(humungous_amounts_of_god_knows_what); 
uint8_t* data; 

Comment puis-je empaqueter ceci comme une instance de NSData et le renvoyer au thread principal? Je suppose que, après la conversion à une instance NSData, je peux simplement appeler:

free(data); 

Oui?

De même, retour sur le thread principal comment puis-je récupérer le pointeur?

Merci,
Doug

Répondre

0

Merci Barry,

En fait, je suis allé avec quelque chose encore plus simple.

Mettez une enveloppe NSValue autour du pointeur:

NSValue *value = [NSValue valueWithPointer:imageData]; 

Stuff dans un dictionnaire à retourner au thread principal:

[result setObject:value forKey:cubicFaceName]; 

Retour sur le thread principal, quand je suis fait avec les données que je les détruisons:

uint8_t *bits = [value pointerValue]; 
free(bits); 

Cheers,
Doug

1

Vous voulez un des -dataWithBytes:length: ou de ses variantes:

NSData *d = [NSData dataWithBytes:data length:lengthOfDataInBytes]; 

qui copie les octets et vous pouvez alors free(data). Pour enregistrer une copie, en supposant data est allouée à l'aide malloc utilisation:

NSData *d = [NSData dataWithBytesNoCopy:data length:lengthOfDataInBytes]; 

Vous devriez pas appel free sur votre tampon dans ce cas, comme l'instance NSData sera le libérer pour vous.

Notez que toutes ces méthodes renvoient une instance autoreleased, vous devrez donc probablement la conserver si vous souhaitez la conserver entre les threads (et n'utilisez pas GC). Vous pouvez utiliser les initialiseurs équivalents alloc/initWithBytes:... à la place.

Pour obtenir un pointeur sur le contenu d'un NSData, utilisez bytes.

(je pense que quelques minutes avec la documentation NSData vous servira bien)