2011-07-06 25 views
5

Nota: Típicamente, en un método dealloc debería liberar variables de instancia de objeto directamente (en vez de invocar un acceso set y pasando nilas el parámetro), como se ilustra en este ejemplo:¿Qué es el tiempo de ejecución moderno?

- (void)dealloc { 
    [property release]; 
    [super dealloc]; 
} 

Si está utilizando la tiempo de ejecución moderna y la síntesis de la variable de instancia, sin embargo, no se puede acceder directamente a la variable de instancia, por lo que debe invocar el método de acceso:

- (void)dealloc { 
    [self setProperty:nil]; 
    [super dealloc]; 
} 

¿Cuál es el tiempo de ejecución moderna en el desarrollo de aplicaciones iOS exactamente?

+0

Posiblemente relacionado: http://stackoverflow.com/questions/5621139/is-there-any-problem-using-self-property-nil-in-dealloc –

+0

No hay respuesta en ese post para lo que es "moderno" tiempo de ejecución ". – Pablo

+2

Ese bit "no se puede acceder directamente a la variable de instancia" solía ser el caso con compiladores anteriores. Con compiladores suficientemente modernos, puede acceder a la variable de instancia de respaldo que se sintetizó automáticamente para una propiedad declarada. –

Respuesta

10

Es posible acceder al ivar directamente, con el mismo nombre que la propiedad sintetizada. La directiva @synthesize crea el ivar en su nombre si uno no existe ya, y dado que es una directiva de compilación, el ivar está disponible en tiempo de compilación. Consulte "Runtime Difference" en el capítulo Propiedades declaradas de El lenguaje de programación Objective-C. Como señaló Abizern en un comentario, también es posible especificar el nombre que desee para el ivar: @synthesize coffee=tea; - aquí, tea es el ivar y coffee de la propiedad.

Para usar el ivar, simplemente consúltelo como cualquier otra variable, sin usar la sintaxis de punto. El siguiente es perfectamente legal y funciona como se esperaba:

@interface Grisby : NSObject {} 
@property (retain) NSObject * obj; 
@end 

@implementation Grisby 

@synthesize obj; 

- (void) dealloc { 
    [obj release], obj = nil; 
    [super dealloc]; 
} 

- (id) init { 
    self = [super init]; 
    if(!self) return nil; 

    obj = [NSObject new]; 

    return self; 
} 

- (NSObject *) obj { 
    return [[obj retain] autorelease]; 
} 

@end 

el "tiempo de ejecución moderna" se introdujo con Mac OS X 10.5 (Leopard) como parte de la transición a 64 bits. Todas las versiones de iOS usan el tiempo de ejecución moderno. Las variables de instancia sintetizadas son una característica del tiempo de ejecución moderno, como se indica en el enlace que proporcioné anteriormente.

La otra diferencia clave, noted in "Runtime Versions and Platforms" de la Guía de programación de tiempo de ejecución de Objective-C, es que las variables de instancia son "no frágiles". Hay una capa de indirección agregada al almacenamiento y acceso de ivar que permite a las clases agregar variables sin afectar el almacenamiento de las clases derivadas. También presumiblemente facilita la síntesis de variable de instancia. Greg Parker has an explanation que involucra gatitos, hay referencias pasajeras en Mike Ash's 2009 runtime writeup, y Bavarious aquí en SO tiene un swell post sobre el almacenamiento de ivar y las extensiones de clase.

Puede ver otras cosas que han cambiado, aunque sin explicación, en el capítulo "Mac OS X Version 10.5 Delta" de la Referencia de tiempo de ejecución de Objective-C.

+0

De hecho. Incluso puede cambiar el nombre del respaldo iVar en '@ synthesize' – Abizern

+1

" Las propiedades declaradas son una característica del tiempo de ejecución moderno "no es verdadero. Los ivars sintetizados son una característica del tiempo de ejecución moderno, pero puedes usar las propiedades declaradas tanto en 32 como en 64 bits en OS X, lo que implica ambos tiempos de ejecución. –

+0

@BJ Homer: gracias por esa nota. Supongo que esto es parte de la confusión en torno al "tiempo de ejecución moderno", las propiedades que se introducen con ObjC-2.0 y Leopard, al mismo tiempo que el MR. –

Cuestiones relacionadas