Hacer propiedades en Objective-C 2.0 requieren de la correspondiente variable de instancia para ser declarado? Por ejemplo, yo 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, lo que si hice esto en su lugar:
MyObject.h
@interface MyObject : NSObject {
}
@property (nonatomic, retain) NSString *name;
@end
Es este sigue siendo válido? Y es que de alguna manera diferente a mi anterior ejemplo?
- ¿Por qué es el segundo ‘Miobjeto.h’ en negrita no ‘Miobjeto.m’?
Si usted está utilizando los Modernos Objetivo-tiempo de ejecución de C (que iOS 3.x o superior, o de 64 bits Snow Leopard o superior), a continuación, haga no necesidad de definir ivars de sus propiedades en casos como este.
Cuando
@synthesize
la propiedad, la ivar, en efecto, ser sintetizados también para usted. Esto se pone alrededor de la «frágil-ivar» escenario. Usted puede leer más acerca de ello en Cacao con AmorEn su interfaz, usted puede declarar formalmente una variable de instancia entre las llaves, o a través de
@property
fuera de las llaves, o ambos. De cualquier manera, se convierten en atributos de la clase. La diferencia es que si se declara@property
, entonces usted puede implementar a través de@synthesize
, que auto-códigos de su getter/setter para usted. La auto-coder setter inicializa enteros y flota a cero, por ejemplo. SI se declara una variable de instancia, y NO se especifica correspondiente@property
, entonces usted puede utilizar@synthesize
y debe escribir su propia getter/setter.Siempre puede invalidar la auto-codificado getter/setter especificar su propio. Esto se hace comúnmente con el
managedObjectContext
propiedad que es perezosamente cargado. Por lo tanto, se declara lamanagedObjectContext
como una propiedad, pero también escribir un-(NSManagedObjectContext *)managedObjectContext
método. Recordemos que un método, que tiene el mismo nombre que una variable de instancia de la propiedad, es el «getter» método.La
@property
declaración de método también permite otras opciones, tales comoretain
yreadonly
, que la variable de instancia método de declaración no. Básicamente,ivar
es la manera antigua, y@property
se extiende y la hace más elegante/más fácil. Puede referirse a usar el auto. prefijo, o no, no importa siempre y cuando el nombre es único para esa clase. De lo contrario, si la superclase tiene el mismo nombre de una propiedad como usted, entonces usted tiene que decir, o como yo.nombre o super.nombre con el fin de especificar el nombre que usted está hablando.Por lo tanto, se verán menos y menos personas declaran
ivar
s entre las llaves, y en lugar de un cambio hacia acaba de especificar@property
y, a continuación, haciendo@synthesize
. Usted no puede hacer@synthesize
en su ejecución, sin un correspondiente@property
. El Sintetizador sólo sabe qué tipo de atributo es a partir de la@property
especificación. Al sintetizar la declaración también le permite cambiar el nombre de las propiedades, por lo que se puede hacer referencia a una propiedad por un nombre (taquigrafía) dentro de su código, pero fuera de el .h archivo de usar el nombre completo. Sin embargo, con el genial autocompletar que XCode tiene ahora, esto es menos de una ventaja, pero todavía está allí.Espero que esto ayude a aclarar la confusión y la desinformación que está flotando alrededor.
@property
, y no usar@synthesize
y no aplicarlas a sí mismo. El compilador de la auto-synthesize
para usted, sin tener que escribir nada más.funciona de las dos formas, pero si no se declara en las llaves, no ver sus valores en el depurador en xcode.
De la documentación:
En general, el comportamiento de las propiedades es idéntica en ambos moderno y el legado de tiempos de ejecución (ver «tiempo de ejecución de Versiones y Plataformas» en Objective-C en tiempo de ejecución Guía de Programación). Hay una diferencia clave: el moderno motor de ejecución admite la variable de instancia de síntesis, mientras que el legado de tiempo de ejecución no.
Para @sintetizar a trabajar en el legado de tiempo de ejecución, debe proporcionar una variable de instancia con el mismo nombre y tipo de archivo compatible de la propiedad o especifique otro existente variable de instancia en el @sintetizar declaración. Con el moderno motor de ejecución, si no se proporciona un ejemplo de variable, el compilador añade uno para usted.
Si usted está usando XCode 4.4 o posterior va a generar una variable de instancia de síntesis código para usted.
Usted sólo tiene que declarar propiedades como la siguiente; va a generar una síntesis de código y la variable de instancia declarar el código para usted.
va a generar una síntesis de código como
y usted puede tener acceso a variable de instancia mediante _name
es similar a declarar
pero si se declara la propiedad de sólo lectura como
va a generar el código de
o
Así que usted debe obtener acceso instantáneo a nombre de la variable con el prefijo «_»
de cualquier forma, usted puede escribir su propia síntesis a continuación, el código del compilador generará código para usted.
usted puede escribir
El Objetivo-C Lenguaje De Programación: La Propiedad De La Implementación De Las Directivas