si la variable en object_getIvar es un tipo de datos básico (por ejemplo, float, int, bool) cómo obtengo el valor como la función devuelve un puntero (id) según la documentación. He intentado convertir a int, int * pero cuando trato de obtener NSLog, obtengo un error sobre un tipo de puntero incompatible.¿Cómo obtengo el valor int de object_getIvar (self, myIntVar) ya que devuelve un puntero
Respuesta
Conseguir:
myFloat = 2.34f;
float myFloatValue;
object_getInstanceVariable(self, "myFloat", (void*)&myFloatValue);
NSLog(@"%f", myFloatValue);
Salidas:
2,340000
Configuración:
float newValue = 2.34f;
unsigned int addr = (unsigned int)&newValue;
object_setInstanceVariable(self, "myFloat", *(float**)addr);
NSLog(@"%f", myFloat);
Salidas:
2,340000
Es probable que encapsule el valor en un NSNumber. Usted puede verificar esto NSLogging className del ID devuelto, así:
id returnedValue = object_getIvar(self, myIntVar);
NSLog(@"Class: %@", [returnedValue className]);
Editar: me encontré con otra pregunta como ésta aquí: Handling the return value of object_getIvar(id object, Ivar ivar)
Desde mi propia experimentación, parecería que mi suposición original, era incorrecto. int y float y otras primitivas parecen devolverse como el valor real. Sin embargo, sería apropiado utilizar ivar_getTypeEncoding para verificar que el valor devuelto sea del tipo que espera que sea.
cuando intento llamar [returnedValue className], Me aparece una advertencia: no se ha encontrado el método className. Luego intenté usar object_getClassName (object_getIvar (self, myIntVar)) (myIntVar está realmente asignado en un bucle for para que cambie) y el bucle se ejecuta una vez y luego termino en GDB pero no hay ningún error registrado. El único valor que se registra es 'nil' ... ¿ideas? –
@Russel Estoy investigando y experimentando. Editaré mi respuesta si descubro algo. –
Jacob lo hizo funcionar usando object_getInstanceVariable, pero todavía tengo curiosidad sobre cómo hacer que object_getIvar funcione porque aparentemente es más rápido (http://developer.apple.com/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html # // apple_ref/c/func/object_getIvar) Intenté buscar en la red ejemplos que lo usaran pero nadie parece usarlo con tipos básicos. –
puede utilizar directamente object_getInstanceVariable
: (no lo he probado)
void *ptr_to_result;
object_getInstanceVariable(obj, "intvarname", &ptr_to_result);
float result = *(float *)ptr_to_result;
Obtengo un tiempo de puntero incompatible en el tercer argumento ... No estoy muy familiarizado con Obj-C, me temo. los documentos dicen que debería ser un puntero vacío, eso es lo mismo que id, ¿no? en cuyo caso estoy de vuelta al mismo problema que el anterior .... –
bien lo cambié para usar void *. pruébelo ahora – newacct
ahora sale a GDB en la última línea sin ningún mensaje de por qué, sin embargo compila sin advertencias. Si presiono continuar en esa línea, obtengo 'EXC_BAD_ACCESS', que creo que está relacionado con la administración de la memoria. ¿Alguna idea adicional? Por cierto, compruebo que mi var typeEncoding = "f" antes de hacer esto no puede deberse a una falta de coincidencia de variables/asignación de memoria, etc. Al menos no lo creo. –
El valor que se devuelve es el valor desde el lugar correcto en el objeto; simplemente no es del tipo correcto. Para int
y BOOL
(pero no float
), sólo podría emitir el puntero a un int
o BOOL
, ya que los punteros y enteros son del mismo tamaño y que se puede lanzar el uno al otro:
(int)object_getIvar(obj, myIntVar)
esto parece funcionar sin embargo ... puedo usar un caso en typeEncoding para manejar los bools y los ints pero para los flotadores todavía estoy buscando una solución. –
Para ARC:
Inspirado por esta respuesta: object_getIvar fails to read the value of BOOL iVar. Tiene que invocar la llamada de función para object_getIvar para obtener ivars de tipo básico.
typedef int (*XYIntGetVariableFunction)(id object, const char* variableName);
XYIntGetVariableFunction intVariableFunction = (XYIntGetVariableFunction)object_getIvar;
int result = intVariableFunction(object, intVarName);
he hecho una pequeña macro útil para una rápida definición de dichos punteros de función:
#define GET_IVAR_OF_TYPE_DEFININTION(type, capitalized_type) \
typedef type (*XY ## capitalized_type ## GetVariableFunctionType)(id object, Ivar ivar); \
XY ## capitalized_type ## GetVariableFunctionType XY ## capitalized_type ## GetVariableFunction = (XY ## capitalized_type ## GetVariableFunctionType)object_getIvar;
Entonces, para los tipos básicos que necesita para especificar las llamadas a la macro (por ejemplo, params(Largo, largo, Longlong) encajará):
GET_IVAR_OF_TYPE_DEFININTION(int, Int)
Y después de que una función para recibir int (o especificado) tipo de variable que se disponga:
int result = XYIntGetVariableFunction(object, variableName)
- 1. dict.get() devuelve un puntero
- 2. ¿Cómo declaras un puntero a una función que devuelve un puntero a una matriz de valores int en C/C++?
- 3. Drupal node_save ya no devuelve $ nid, entonces, ¿cómo lo obtengo?
- 4. valor de incremento de int siendo apuntada por el puntero
- 5. ¿Hay un puntero SELF para los bloques?
- 6. Subproceso de Python con redirección stdout que devuelve un int
- 7. ¿Cómo imprimo el valor del puntero de un objeto Go? ¿Qué significa el valor del puntero?
- 8. Error al verificar una función que devuelve un int
- 9. devuelve un int o pasa un puntero int - ¿Qué es mejor?
- 10. Macro que devuelve un valor
- 11. ¿Qué sucede si main() no devuelve un valor int?
- 12. C# Tarea que devuelve un valor
- 13. ¿Cómo `({...})` devuelve un valor?
- 14. ¿Por qué obtengo el mismo valor cuando imprimo este int?
- 15. ¿Cómo obtengo el valor de MemberInfo?
- 16. definir una función que devuelve el puntero estructura
- 17. Cómo escribir un puntero al método que devuelve un puntero al método?
- 18. javax.servlet.HttpServletRequest.getContentLength() devuelve int solo
- 19. ¿Cómo obtengo el valor int ASCII de un personaje en Cocoa?
- 20. ¿Cómo obtengo el valor de object (stdClass)?
- 21. Devuelve el valor del subproceso de Python
- 22. CGGradientCreateWithColors devuelve un puntero nulo
- 23. ¿Por qué 'fopen' devuelve un puntero NULL?
- 24. C: ¿cómo accedes al valor de un puntero a un puntero a ese valor?
- 25. Sintaxis para un puntero a una función que devuelve un puntero de función en C
- 26. C++ función de miembro const que devuelve un puntero const .. Pero, ¿qué tipo de const es el puntero devuelto?
- 27. ¿Por qué tener un puntero a un puntero (int ** a)?
- 28. Pasando un puntero a putchar a una función que recibe un int (*) (int)
- 29. Parece que File.GetLastWriteTime devuelve el valor 'desactualizado'
- 30. Cómo convertir el valor enum a int?
Eso no funciona porque tienes un error tipográfico, si cambias (nulo) y myFloatValue a (void *) & myFloatValue funciona como se anuncia. –
Maldición, tienes razón :) – jhauberg
¿Alguna idea para object_setInstanceVariable for a float? Puedo hacer que funcione para una int a través de int myInt = 5; int theInt; object_setInstanceVairable (self, "theInt", (void *) myInt); porque los punteros y las entradas son del mismo tamaño, por lo que no funciona para flotadores. –