2010-05-31 6 views
4

Merci d'avoir regardé ma question.Obtenir la valeur Ivar de CGPointin Objectif-C

J'ai essayé de regarder autour de moi et j'ai joué avec des IVars de bas niveau pour obtenir des informations sur les cours. J'ai du mal à charger les valeurs provenant de CGPoint.

CGPoint point; 
object_getInstanceVariable(obj, [columnName UTF8String], (void **)&point); 
NSLog(@"%@", NSStringFromCGPoint(point)); 

La sortie de ce devrait être {} 220180

Le Je reçois effectivement {220, 1.72469e-38}

Quelqu'un pourrait-il me aider et expliquer pourquoi cette pourrait se produire?

Répondre

0

Les pointeurs sont mélangés ici. point est une instance, donc &point est un pointeur (void *-like), pas un pointeur vers un pointeur (void **-like). Vous avez besoin de quelque chose comme ceci:

CGPoint *point; 
object_getInstanceVariable(obj, [columnName UTF8String], (void **)&point); 
NSLog(@"%@", NSStringFromCGPoint(*point)); 
+0

object_getInstanceVariable (self, [@ "annotationLocation" UTF8String], (void **) & point); NSLog (@ "% @", NSStringFromCGPoint (* point)); nice try :) qui me donne exc_bad_access – eaymon

+0

Êtes-vous sûr que annotationLocation est un champ CGPoint? Aussi, ne faites pas [@ "annotationLocation" UTF8String], faites juste "annotationLocation" sans "@" – unbeli

+0

en fait il y a plus de problèmes avec cela, lisez la meilleure solution ici: http://stackoverflow.com/questions/1219081/ object-getinstancevariable-fonctionne-pour-float-int-bool-mais-non-pour-double – unbeli

1

Le vrai problème ici est qu'un CGPoint n'est pas un objet - c'est une structure plaine-vieille-C. :-)

0

object_getInstanceVariable() copie uniquement une valeur de pointeur de données au début du décalage de l'ivar. C'est tout le stockage que vous lui donnez, après tout, avec cet argument final void **. Quand vous savez que vous avez plus d'un pointeur valeur de données, comme dans ce cas, vous pouvez utiliser ivar_getOffset() pour trouver où les données commence alors copier sur autant d'octets que vous avez besoin:

Ivar iv = object_getInstanceVariable(obj, [columnName UTF8String], NULL); 
ptrdiff_t offset = ivar_getOffset(iv); 
CGPoint point = *(CGPoint *)((char *)obj + offset); 

Dans ce cas, le déréférencement d'un CGPoint * provoque la copie de sizeof(CGPoint) octets de l'adresse référencée; Dans le cas général, vous pouvez memcopy() ou bcopy() des données de l'adresse calculée dans un tampon de taille appropriée. Le prochain problème serait de calculer la bonne taille au moment de l'exécution ...