7
votes

Comment puis-je obtenir la valeur int d'objet_getivar (Self, MyNtintvar) car il renvoie un pointeur

Si la variable dans Object_Gettivar est un type de données de base (par exemple, float, int, bool) Comment puis-je obtenir la valeur car la fonction renvoie un pointeur (ID) en fonction de la documentation. J'ai essayé de jeter avec un int, INT * mais lorsque j'essaie d'obtenir cela à NSLog, j'ai une erreur sur un type de pointeur incompatible.


0 commentaires

5 Réponses :


-1
votes

Il est probablement en boxe de la valeur dans un nombre NSNumber. Vous pouvez vérifier cela en nslogging le nom de classe d'identifiant retourné, comme: xxx

modifier: j'ai trouvé une autre question comme celle-ci ici: Gestion de la valeur de retour d'Object_Gettivar (objet d'identification, ivar ivar)

de ma propre expérimentation, il semblerait que mon hypothèse d'origine était incorrecte. int et flotter et autres primitives semblent être retournés comme valeur réelle. Cependant, il serait approprié d'utiliser ivar_gettypeCoding pour vérifier que la valeur renvoyée est le type que vous attendez que ce soit.


3 commentaires

Lorsque j'essaie d'appeler [RetourDevalue CLASSNAME], je reçois un avertissement Aucun nom de classe de classe trouvée. J'ai ensuite essayé d'utiliser objet_getclassname (objet_getivar (auto, myInvar)) (MyIntonVar est réellement attribué à une boucle pour que cela change de temps) et la boucle s'exécute une fois, puis je finis par GDB, mais aucune erreur n'est enregistrée. La seule valeur qui est consignée est «nil» ... des idées?


@Russel J'en examine et expérimente. Je vais éditer ma réponse si je saisis quelque chose.


Jacob a eu pour travailler avec Object_GetInstanceVariable mais je suis toujours curieux de savoir comment obtenir objet_getivar de fonctionner car il est apparemment plus rapide ( développeur.apple.com/documentation/cocoa/reference/... ) a essayé de rechercher sur le net pour des exemples en l'utilisant mais personne semble l'utiliser avec des types de base.



-1
votes

Vous pouvez utiliser objet_getinstancevariable code> directement: (ne l'a pas testé)

void *ptr_to_result;
object_getInstanceVariable(obj, "intvarname", &ptr_to_result);
float result = *(float *)ptr_to_result;


2 commentaires

Je reçois un temps de pointeur incompatible sur la 3ème argument ... Je ne suis pas terriblement familier avec Obj-C, j'ai peur. Les docs disent que cela devrait être un pointeur vide, c'est la même chose que je pense que je pense? Dans quel cas je suis de retour au même problème que ci-dessus ....


Il sort désormais à GDB à la dernière ligne sans aucun message sur la raison pour laquelle, ne compile aucun avertissement. Si je frappe continuer à cette ligne, je reçois "exc_bad_access" que je pense est lié à la gestion de la mémoire. Des pensées supplémentaires? BTW je vérifie que mon type varié = "F" avant de le faire, de sorte que cela ne peut pas être dû à une inadéquation des variables / une allocation de mémoire, etc. Au moins, je ne le pense pas.



2
votes

La valeur renvoyée est la valeur du bon endroit de l'objet; Juste pas le bon type. Pour int code> et bool code> (mais pas float code>), vous pouvez simplement lancer le pointeur sur un int code> ou ou BOOL code>, puisque les pointeurs et INTS ont la même taille et ils peuvent être déployés les uns aux autres:

(int)object_getIvar(obj, myIntVar)


1 commentaires

Cela semble fonctionner cependant ... Je peux utiliser un cas sur le typeencoding pour gérer les bools et l'INT, mais pour les flotteurs, je cherche toujours une solution.



6
votes

obtenir strud>: xxx pré>

sorties: p>

2.340000 P> BlockQuote>

Réglage STRT>: P>

float newValue = 2.34f;
unsigned int addr = (unsigned int)&newValue;

object_setInstanceVariable(self, "myFloat", *(float**)addr);

NSLog(@"%f", myFloat);


4 commentaires

Cela ne fonctionne pas parce que vous aviez une faute de frappe, si vous changez (void) et myfloatvalue vers (vide *) & myFloatValue, cela fonctionne comme annoncé.


Des idées pour objet_setInstanceVariable pour un flotteur? Je peux le faire fonctionner pour une INT via int mint = 5; int intint; objet_setInstanceVairable (Self, "Theint", (vide *) myint); Parce que les pointeurs et les INT sont de la même taille, il ne fonctionne donc pas pour des flotteurs.


Cela fonctionne effectivement :) Merci! Pourrait s'il vous plaît expliquer pourquoi vous avez besoin (flotteur * )? Je comprends que (float **) est en train de casser Addr en tant que pointeur sur un pointeur sur lequel vous avez alors une déréférence. Mais comme ADDR tient l'adresse de NewValue, Isnt Adrit est-il comme un pointeur, il vous suffit donc de le jeter en tant que flotteur * et de désespections qui? Cela ne fonctionne pas mais je ne comprends pas pourquoi. Qu'est-ce que je rate?


Malheureusement, objet_getinstancevariable et objet_setInstancevariable n'est pas disponible en arc



4
votes

pour arc:

inspiré de cette réponse: Object_Gettivar ne parvient pas à lire la valeur de Bool Ivar . Vous devez lancer la fonction d'appel pour Object_Gettivar pour obtenir des ivars de type de base. P>

int result = XYIntGetVariableFunction(object, variableName)


0 commentaires