Pregunta

Tengo un objeto que tiene varias propiedades. Si tengo un puntero a una de esas propiedades, ¿es posible obtener un puntero a la instancia de clase a la que pertenece ese ivar?

por ejemplo: foo.bar, donde sé la dirección de bar, ¿se puede encontrar la dirección de foo?

Esto parece estar relacionado con: referencias de tiempo de ejecución pero no vi ninguna referencia que fuera exactamente lo que estaba buscando.

¡Gracias por tu ayuda!

¿Fue útil?

Solución

Primero, necesita ajustar un poco su terminología. No puede tener un puntero a una propiedad, porque una propiedad es una interfaz para un objeto, especificando el formato de los métodos getter y setter.

Si tuviera un puntero al getter, un método (IMP) en el mejor de los casos que podría recuperar sería un puntero a la clase, ciertamente no podría volver a una instancia.

Si tuviera un puntero a un ivar, no creo que haya alguna forma de volver a la instancia del objeto que lo contiene. Si tuviera una variedad de todos los posibles foos, podría ser posible pedirles a cada uno una lista de ivars, y obtener la dirección de cada ivar y eventualmente encontrar la instancia en cuestión de esa manera.

La mejor solución es que bar contenga una referencia principal a foo, de modo que foo.bar.foo le dé la respuesta que desea. Pero depende de qué es exactamente lo que estás tratando de hacer. La forma normal de Cocoa para muchas de estas cosas es pasar por alto también, como se hace para muchos delegados. Por ejemplo:

[obj foo:foo doSomethingWithBar:foo.bar];

Otros consejos

A menos que el objeto tenga un puntero de vuelta a su '' padre '' o usted lo rastrea explícitamente, no creo que haya una manera de resolverlo. Realmente tendría que rastrear a través de la memoria para encontrar lo que básicamente equivale a "quién me señala". Es esencialmente el mismo problema que encontrar el nodo anterior en una lista enlazada individualmente & # 8212; debe comenzar desde el principio y detenerse cuando llegue al nodo que apunta al nodo de interés.

El problema al intentar rastrear foo desde la dirección a bar es que foo.bar es un puntero que contiene la dirección de un objeto, y solo foo lo llama " bar " ;. Por simplicidad, imagine que foo está en la dirección 0x1000, y foo.bar está en 0x1008 y apunta a otro objeto en 0x2000. Ahora, si tiene la dirección 0x2000, no hay una manera fácil de saber que 0x1008 apunta a ella.

Es aún más complicado si imagina que N otras direcciones también podrían apuntar a 0x2000, por lo que incluso si escaneara la memoria, no sabría si el puntero pertenecía a un objeto, estructura, variable local o incluso era un patrón aleatorio que coincide con la dirección que estás buscando.

Podría hacerlo si tiene un puntero a la variable de instancia en sí, en lugar de los contenidos de la variable de instancia.

Foo * reference = [[Foo alloc] init];
Foo * foo == [[Foo alloc] init];
int * barptr = &(foo->bar);
Foo * baz = (Foo *)((char *)barptr - ((char *)(&(reference->baz)) - (char *)reference));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top