¿Las propiedades en Objective-C 2.0 requieren que se declare una variable de instancia correspondiente? Por ejemplo, estoy acostumbrado a hacer algo como esto:
MyObject.h
@interface MyObject : NSObject {
NSString *name;
}
@property (nonatomic, retain) NSString *name;
@end
MyObject.m
@implementation
@synthesize name;
@end
Sin embargo, ¿qué pasa si hago esto en su lugar?
MyObject.h
@interface MyObject : NSObject {
}
@property (nonatomic, retain) NSString *name;
@end
¿Sigue esto siendo válido? ¿Y es de alguna manera diferente a mi ejemplo anterior?
Respuestas:
Si está utilizando Modern Objective-C Runtime (que es iOS 3.xo superior, o Snow Leopard de 64 bits o superior), entonces no necesita definir ivars para sus propiedades en casos como este.
Cuando tenga
@synthesize
la propiedad, el ivar se sintetizará también para usted. Esto evita el escenario "frágil-ivar". Puedes leer más sobre esto en Cocoa with Lovefuente
En su interfaz, puede declarar formalmente una variable de instancia entre las llaves, o por
@property
fuera de las llaves, o ambas. De cualquier manera, se convierten en atributos de la clase. La diferencia es que si declara@property
, puede implementar using@synthesize
, que codifica automáticamente su getter / setter por usted. El configurador del codificador automático inicializa enteros y flota a cero, por ejemplo. SI declara una variable de instancia y NO especifica una correspondiente@property
, entonces no puede usar@synthesize
y debe escribir su propio getter / setter.Siempre puede anular el getter / setter codificado automáticamente especificando el suyo. Esto se hace comúnmente con la
managedObjectContext
propiedad que se carga de forma diferida. Por lo tanto, declaras tumanagedObjectContext
como una propiedad, pero luego también escribes un-(NSManagedObjectContext *)managedObjectContext
método. Recuerde que un método, que tiene el mismo nombre que una variable de instancia / propiedad es el método "captador".El
@property
método de declaración también le permite otras opciones, comoretain
yreadonly
, que el método de declaración de la variable de instancia no tiene. Básicamente,ivar
es la forma antigua, la@property
amplía y la hace más elegante / fácil. Puede referirse a usar el self. prefijo, o no, no importa siempre que el nombre sea exclusivo de esa clase. De lo contrario, si su superclase tiene el mismo nombre de propiedad que usted, entonces debe decir como self.name o super.name para especificar de qué nombre está hablando.Por lo tanto, verá cada vez menos personas declarando
ivar
s entre las llaves y, en su lugar, cambiará a solo especificar@property
y luego hacer@synthesize
. No puede hacer@synthesize
en su implementación sin un correspondiente@property
. El sintetizador solo sabe qué tipo de atributo es de la@property
especificación. La declaración de síntesis también le permite cambiar el nombre de las propiedades, de modo que pueda referirse a una propiedad por un nombre (abreviatura) dentro de su código, pero afuera en el archivo .h use el nombre completo. Sin embargo, con el autocompletado realmente genial que tiene XCode ahora, esto es una ventaja menor, pero sigue ahí.Espero que esto ayude a aclarar toda la confusión y la desinformación que está flotando por ahí.
fuente
@property
, no usarlos@synthesize
y no implementarlos usted mismo. El compilador se auto-synthesize
para usted, sin tener que escribir eso más.funciona en ambos sentidos, pero si no los declara entre llaves, no verá sus valores en el depurador en xcode.
fuente
De la documentación:
En general, el comportamiento de las propiedades es idéntico en los tiempos de ejecución modernos y heredados (consulte "Versiones y plataformas en tiempo de ejecución" en la Guía de programación en tiempo de ejecución de Objective-C). Hay una diferencia clave: el tiempo de ejecución moderno admite la síntesis de variables de instancia, mientras que el tiempo de ejecución heredado no.
Para que @synthesize funcione en el tiempo de ejecución heredado, debe proporcionar una variable de instancia con el mismo nombre y tipo compatible de la propiedad o especificar otra variable de instancia existente en la instrucción @synthesize. Con el tiempo de ejecución moderno, si no proporciona una variable de instancia, el compilador agrega una por usted.
fuente
Si está utilizando XCode 4.4 o posterior, generará código de síntesis de variable de instancia para usted.
Solo tienes que declarar propiedades como las siguientes; generará código de síntesis y variable de instancia declarando código para usted.
generará código de síntesis como
y puede acceder a la variable de instancia usando _name, es similar a declare
pero si declaras una propiedad de solo lectura, es como
generará código
o
Por lo tanto, debe acceder al nombre de la variable instantánea sin el prefijo "_" de cualquier manera que pueda escribir su propio código de síntesis, luego el compilador generará el código para usted. puedes escribir
fuente
El lenguaje de programación Objective-C: directivas de implementación de propiedades
fuente