2009-04-19 4 views
3

J'ai code comme ceci:Cast "vide const *" à "const char *"

NSData *data = [NSData dataWithContentsOfURL:objURL]; 
const void *buffer = [data bytes]; 
[self _loadData:buffer]; 
[data release]; 

la fonction "_loadData" prend un argument comme:

- (void)_loadData:(const char *)data; 

Comment convertir " const void "à un" const char "sur Objective-C?

+0

La [libération de données]; ligne est inutile. Dans les environnements non-garbage-collect votre application va probablement planter et cela montre que vous ne comprenez pas complètement la gestion de la mémoire Cocoa. Vous ne publiez que si vous avez explicitement appelé alloc, copy ou mutableCopy (peut-être d'autres auxquels je ne peux pas penser maintenant). L'objet renvoyé à partir de [NSData dataWithContentsOfURL:] est automatiquement libéré ou récupéré. – dreamlax

+0

Même sur l'iPhone où il n'y a pas de garbage collection? –

+0

Dans un environnement non collecté, l'objet est ajouté à un pool d'autorelease et sera probablement désalloué dans la boucle d'événement suivante ou lorsque le pool lui-même est désalloué. Dans tous les cas, vous ne «possédez» pas l'objet retourné, donc ce n'est pas à vous de le faire, si vous voyez ce que je veux dire. Vous ne possédez que des objets que vous attribuez explicitement, soit + alloc, -copy, ou -mutableCopy (et peut-être d'autres). – dreamlax

Répondre

5

comme vous le feriez dans C:

[self _loadData:(const char *)buffer]; 

devrait fonctionner.

+0

Merci! J'avais essayé d'assigner un tampon à un autre type en pensant "ce sont juste des pointeurs, ça devrait marcher". const char * charBuff = tampon; Je n'ai jamais pensé à le jeter. Ha! –

+0

Cela aurait aussi fonctionné, sauf "const char * charBuff = (const char *) buffer; (assignation à une variable char *, vous avez toujours besoin de la conversion) – duncanwilcox

3

Vous ne devez pas libérer l'objet de données car vous ne l'avez pas alloué explicitement. En outre, vous pouvez effectuer une distribution simple:

[self _loadData:(const char *) buffer]; 
+0

Bonne capture sur le NSData J'ai besoin d'en savoir plus sur la mémoire gestion Merci. –

Questions connexes