2011-08-31 15 views
5

estoy desconcertado por cómo se declara variable en C objetivaobjetivo básico C declaración de variable

1: Veo @property y @synthesize declaración que se utilice. Mi pregunta con respecto a eso es, ¿para qué son estas 2 afirmaciones? ¿Por qué se usan siempre juntos? Supongo que @synthesize es un atajo para crear getter y setter?

2: Digo, quiero declarar un NSMutableArray que solo sería accesible dentro de la clase declarada. Tengo que realizar myArray = [[NSMutableArray alloc] init] antes de usar el método addObject para escribirle algo. ¿Cuándo lanzo la matriz, entonces?

3: ¿Existe alguna forma diferente de declarar una variable a la que solo se puede acceder en la clase declarada accesible en todas las clases?

4: Similar a la pregunta 2, pero ahora la variable es un NSString. ¿Por qué no tengo que asignar & init it para compartir la misma variable dentro de su propia clase? ¿Cuál es la diferencia entre self.myString = @""; a myString = @"";

Muchas gracias.

+0

Al ingresar al objetivo-c, es posible que desee consultar los cursos de Stanford (iTunes). Me ayudó a levantar la curva de aprendizaje. – nykash

+0

Esta es una pregunta muy amplia que cubre el terreno que está bien pisado aquí en SO. Por favor mira a tu alrededor. Aquí hay cuatro publicaciones anteriores que abordan sus preguntas. 1: [¿Cuál es la diferencia entre @property y @synthesize?] (Http: // stackoverflow.com/questions/806379 /) 2: [Cuándo liberar una variable de instancia] (http://stackoverflow.com/questions/4063905/) 3: [¿Cómo declarar variables de instancia no visibles fuera de la instancia?] (http://stackoverflow.com/questions/5826345/) 4: [Diferencia entre self.var vs. var] (http://stackoverflow.com/questions/4627646/) Hay otros en cada uno de estos temas. –

Respuesta

1

1) @property declara una variable de acceso público y getter y setter asociados. @synthesize hace que el compilador genere automáticamente la definición (código) de getter y setter.

2) Debería declarar NSMutableArray en su declaración de clase, en el archivo de encabezado. Inicializaría la variable en su método init y liberaría la variable en su método dealloc.

3) Las variables creadas usando @property son públicas. Las variables definidas en su declaración de clase (usando @interface en el archivo de encabezado) pueden declararse como privadas para esa clase, utilizando la palabra clave @private.

John, estas preguntas son bastante básicas. Es probable que obtenga mucho de la Introducción a la programación de Objective-C aquí (http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html#//apple_ref/doc/uid/TP30001163).

+0

'@ property' no declara una _variable_ de acceso público. El ivar en sí (si está sintetizado) es '@ protected'. Lo que declara es un punto de acceso para algún aspecto de la clase. En realidad, ni siquiera tiene que haber una variable que lo respalde, siempre y cuando cumpla con el contrato de tener un método getter y setter (o simplemente getter, en el caso de 'readonly'). –

+0

Gracias por la aclaración Josh. –

+1

FWIW, si escribe su propio getter y/o setter, una propiedad ni siquiera tiene que tener un ivar. También puede calcular algo o convertir de un elemento a otro. P.ej. una clase de ángulo también podría tener una propiedad de grados como una propiedad radianes. Solo la propiedad radianes tiene un respaldo ivar, pero los grados de propiedad (a través de setter y getter, 'degrees' y' setDegrees: ', respectivamente) se convierten ay desde radianes, dependiendo de la dirección. Una clase de archivo puede tener una propiedad fullName que use el servidor, el directorio y el nombre de archivo para generar o analizar un nombre completo. –

5

Para su primera pregunta:

@property (nonatomic, retain) NSString * someProperty; 

Esto declara una propiedad de la clase. Se convierte en parte del contrato público de la clase, pero todavía le falta algo importante - implementación real

@synthesize someProperty; 

Este es el azúcar compilador, su crea un captador y el método de selección para su propiedad. A saber, esta es la implementación que se necesita para usar realmente su propiedad en su clase y de otras clases.

En casi todas las situaciones, siempre tendrá un @synthesize por cada @property que declare.


Para su segunda pregunta:

estás en lo correcto acerca de cómo iniciar su propiedad de matriz.Con el fin de liberarlo tendría que hacer lo siguiente en su método dealloc clases:

- (void) dealloc { 
    self.myarray = nil; 

    [super dealloc]; 
} 

Esto libera efectivamente la matriz (suponiendo que declaró su propiedad con la palabra clave retener).


Y para su última pregunta:

propiedades de una clase están siempre disponibles de otras clases. Para crear una variable accesible a nivel mundial, la declararía como static.

+0

Es posible que no tenga ''s sintetizar' para cada propiedad. También puede ser '@ dynamic', o simplemente puede declarar un ivar e implementar los métodos correctamente nombrados. –

+0

Estoy de acuerdo con su primer punto, pero su segundo punto no está relacionado con @property y más relacionado con KVC. Editado mi respuesta para reflexionar. – Perception

+1

@Josh: de hecho. En uno de los otros comentarios, di algunos ejemplos en los que escribe nuestros propios descriptores de acceso y ni siquiera tiene un ivar, ya que los usuarios pueden confiar en otros medios (acceso directo a archivos, un puerto, una base de datos, un algoritmo, etc. .) que obtener o establecer un ivar directamente. En tales casos, no sintetizas. –

2

Anuncio 1: una propiedad es una construcción para controlar el acceso de un ivar (generalmente privado) por getters y setters. En realidad, una propiedad ni siquiera tiene que tener un ivar de apoyo. Sí, @synthesize genera getter y setter (y ivar).

Anuncio 2: Lo sueltas cuando ya no lo necesitas. Cuando eso es depende de la lógica de tu código.

Anuncio 3: Si lo entiendo correctamente, quiere @private ivars. Normalmente, los ivars están protegidos, es decir, solo accesibles dentro de la clase o en clases derivadas. Los ivars privados solo son accesibles dentro de la clase. Las propiedades son de acceso público.

Anuncio 4: myString = @ "" escribe directamente en el ivar, mientras que self.myString = @ "" usa el configurador de propiedades.

+0

Me tropecé con una ocasión en la que no pude leer el ivar dentro de la clase. Estaba usando 'ivar = algo' entonces. Cambiarlo a 'self.ivar = algo' resolvió el problema. ¿Podrías compartir algunas ideas sobre lo que sucedió? Supongo que el ivar se liberó automáticamente ya que estaba leyendo NULL. Si ayuda, el ivar fue CLLocation. No tuve que realizar 'self' para' NSString' ivars. – John

+0

Las propiedades, si se declaran como (copiar) o (retener), retendrán el elemento (y lanzarán un elemento anterior), mientras que el acceso directo al ivar no hace nada por el estilo. Las propiedades lo ayudan a realizar la administración de la memoria, ya que el compilador generará un código que conservará y liberará correctamente los elementos. Todavía deben ser liberados en dealloc, por supuesto. Intente utilizar propiedades en todas partes, excepto quizás en init y dealloc. –

0

Necesita obtener un texto en Objective-C o encontrar un tutorial en línea: es un lenguaje suficientemente arcano que no puede esperar recogerlo en dribs y drabs.

Hay variables y hay propiedades, dos cosas diferentes que se cruzan un poco.

Se pueden declarar variables de instancia llanura de edad de la misma manera que en C/C++, más o menos:

NSArray* myArray; 

por ejemplo, colocado en la sección cerrada de la {} @interface.

Pero también puede tener una PROPIEDAD que declare diciendo @property en la declaración @interface (después del cierre }). Una propiedad tiene un método getter, por defecto llamado myProperty, y un método putter, por defecto llamado setMyProperty. Si myProperty es el mismo nombre que una de sus variables de instancia, puede usar @synthesize para crear automáticamente estos métodos.

Tenga en cuenta que las propiedades pueden ser automáticamente retain ed cuando se utiliza el método predeterminado de configuración. Esto es bastante conveniente en términos de administración de almacenamiento.

Pero administrar el almacenamiento es un tema importante, uno sobre el que DEBE leer un buen tutorial, no podemos explicarlo en unos pocos párrafos.