2011-05-22 34 views
6

He estado leyendo sobre los ivars sintetizados automáticamente. Mi pregunta es: "¿Dónde se asignan automáticamente?" Hubiera esperado que fueran parte de mí mismo, para poder verlos en el depurador, pero parece que la única forma en que puedo verlos es invocando el método de acceso (a través del comando gdb 'po'). ¿No hay espacio en la estructura de la clase/objeto (como sería para un ivar explícitamente declarado)?¿Dónde se almacenan los ivars sintetizados?

(¿Existe una descripción de la representación en memoria para un objeto de Objective-C moderna?)

ser un tipo C, que me hace muy incómodo para no ser capaz de ver dónde está todo. :-P

Respuesta

1

Parece que este le dirá: How do automatic @synthesized ivars affect the *real* sizeof(MyClass)?

Soy un tipo C en el fondo también. ¿Por qué molestarse en usar estos autogenerados? Me gusta mirar una clase y ver a qué se aferra en términos de datos.

Interesante: limpio cómo tomaron el cambio de 64 bits para mejorar las cosas. http://www.sealiesoftware.com/blog/archive/2009/01/27/objc_explain_Non-fragile_ivars.html

+0

¿Sigue siendo cierto que no puede usar ivars dinámicos en el simulador? Si es así, ese tipo de latas en el iPhone. Además, desarrollar para OS X significa binarios de 32 bits, por lo que tampoco puedo verlos allí, en la vida real. –

+0

Creo que ahora puedes usarlos en el simulador, pero no lo recuerdo con certeza. – Wevah

+0

El tiempo de ejecución del simulador y el tiempo de ejecución del dispositivo funcionan de la misma manera. – bbum

1

Se añaden al objeto objetivo-c (que es una estructura C) no es diferente a una Ivar regular, así por ejemplo:

@interface TestObject : NSObject { 

} 

@property (nonatomic, assign) int theInt; 

@end 

@implementation QuartzTestView 

@synthesize theInt; 

@end 

puede hacer referencia a theInt Ivar directamente (no a través de acceso de propiedad) o bien:

- (void)someMethod { 
    theInt = 5; 
} 

O

- (void)someOtherMethod { 
    self->theInt = 10; 
} 
+0

Usted dice "no diferente de un ivar normal", pero los ivars normales aparecen en el depurador, los que no tienen una declaración explícita no aparecen. – wrlee

+0

@wrlee, de hecho lo hacen, y en el orden en que los sintetizas. Vea [this] (https://picasaweb.google.com/lh/photo/xmeQ0hYCt7SAL1DNFXRhfzhx437tMWI6RAv8g-2VuS0?feat=directlink) captura de pantalla, y tenga en cuenta que 'self' se expande en la ventana del reloj. –

0

Consulte http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html - utilizando el tiempo de ejecución moderno, se creará una variable de instancia "sintetizada para usted". Sin embargo, puede ser útil agregar una variable usted mismo (para que pueda verlo al depurarlo), sin embargo, debe tener cuidado de no realizar asignaciones directas a la variable de instancia para conservar o copiar las propiedades basadas.

+0

Esa fue la base de mi confusión: que no podía ver los ivars en el depurador. Pienso en las directivas @ property/@ sintetizar como etiquetas de conveniencia y que el código resultante debería haber sido exactamente como si hubiera especificado los ivars explícitamente; ya que no aparecen en el depurador, ese no parece ser el caso.Entonces, ¿qué está pasando realmente, que el depurador no muestra los ivars como parte de uno mismo? – wrlee

+1

Al ver uno de los videos de la conferencia Apple dev, resulta que hay un error en alguna versión de Xcode que lo causó no mostrar los ivars inferidos. – wrlee

Cuestiones relacionadas