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’?
InformationsquelleAutor indragie | 2010-06-19

6 Comentarios

  1. 94

    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 Amor

  2. 71

    En 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 la managedObjectContext 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 como retain y readonly, 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 ivars 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.

    • Excelente explicación..
    • realmente excelente
    • Esta respuesta aclarado semanas de confusión para mí!
    • Esta debe ser la respuesta correcta.
    • Hoy en día no es obligatorio escribir @sintetizar .Entonces, ¿cómo es esta respuesta válida en ese caso!
    • Usted no TIENE QUE declarar <code>@property…@synthesize</código de>. El uso de sintetizar lo releva de tener que escribir un getter/setter en implementación. Si no sintetizar, entonces usted debe hacer su propia getter/setter
    • Eso es incorrecto. Usted puede utilizar @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.

  3. 8

    funciona de las dos formas, pero si no se declara en las llaves, no ver sus valores en el depurador en xcode.

  4. 3

    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.

  5. 3

    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.

    @property (nonatomic, strong) NSString *name;

    va a generar una síntesis de código como

    @synthesize name = _name;

    y usted puede tener acceso a variable de instancia mediante _name
    es similar a declarar

    NSString* _name

    pero si se declara la propiedad de sólo lectura como

    @property (nonatomic, strong, readonly) NSString *name;

    va a generar el código de

    @synthesize name;

    o

    @synthesize name = name; 

    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

    @synthesize name = _name;
  6. 1

    El Objetivo-C Lenguaje De Programación: La Propiedad De La Implementación De Las Directivas

    Existen diferencias en el comportamiento de los descriptores de síntesis que dependen del tiempo de ejecución (véase también «tiempo de ejecución de la Diferencia»):

    • Para el legado de tiempos de ejecución, las variables de instancia de la que ya debe ser declarada en el @bloque de interfaz de la clase actual. Si una variable de instancia con el mismo nombre que la propiedad existe, y si su tipo es compatible con el tipo de la propiedad, se utiliza—de lo contrario, se obtiene un error del compilador.

    • Para los modernos 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), las variables de instancia son sintetizadas como sea necesario. Si una variable de instancia con el mismo nombre ya existe, es utilizado.

Dejar respuesta

Please enter your comment!
Please enter your name here