2009-09-05 23 views
5

estática ¿Cuál es la diferencia entre:Objective C - miembros y constantes

@interface SomeClass : NSObject { 
    NSObject *something; 
} 

y

@interface SomeClass : NSObject { 

} 
NSObject *something; 

? Además, ¿cuál es la diferencia entre final de Java y Objective C (C) const? ¿Y dónde debería declarar miembros estáticos de la clase para las siguientes situaciones: 1. Cuando solo la clase lo necesita ** 2. ** ¿Dónde podría ser una propiedad que otras clases podrían leer? Ya sé sobre #define, pero eso no es bueno para los objetos porque crea nuevos cada vez. ¡Gracias!

Respuesta

7

La primera es una variable de instancia y crea un something para cada instancia de SomeClass. Es similar a C

typedef struct { 
    NSObject *something; 
} SomeClass; 

Este último declara una variable global que no tiene una asociación real con SomeClass. En C, es equivalente a

NSObject *something; 

definido en alcance global. Objective-C en realidad no tiene variables de clase, por lo que se utilizan variables globales (más bien, a veces se usan; las variables con compilation unit alcance y estática storage class son las que se deben usar).

La forma más limpia de definir una variable de "clase" es definir una variable estática en el archivo de implementación. De esta forma, solo los métodos de clase pueden acceder a él y evitará contaminar el espacio de nombres global. Si quiere que esté disponible públicamente, defina los descriptores de acceso.

Destruir las variables de clase correctamente puede ser complicado. La memoria se recuperará y los archivos abiertos se cerrarán automáticamente cuando la aplicación salga, pero es posible que otros recursos no se manejen tan bien.

2

En cuanto a la pregunta "final versus const", ambas son similares. Ellos afirman que el valor no puede cambiar. tenga en cuenta que en Java, como todos los valores (excepto las primitivas) son punteros, el objeto al que apunta puede cambiar debajo, pero la ubicación de la memoria (el puntero) nunca cambiará. Creo que esperarías un comportamiento similar en Objective C, y siempre es una buena idea no permitir que los elementos que son mutables sean "finales" o "const" ya que los valores dentro del objeto aún pueden modificarse.

+0

Tenga en cuenta que "final" es similar a un puntero const ("' * const' "), no un puntero a const (" ' const *' "). También es muy similar a los tipos de referencia de C++ ("' & '"). – outis

+0

Gracias por aclarar eso: siempre confundo los casos especiales :) – aperkins

+0

Si crees que es confuso, consulta: http://www.strainu.ro/programming/c/a-little-fun-with-cdecl/ – outis