objective-c automatic-ref-counting

objective c - Variables de instancia declaradas en el archivo de implementación de ObjC.



objective-c automatic-ref-counting (3)

De hecho, esta es una nueva característica de lenguaje, y si debe declarar sus ivars (en lugar de simplemente declarar propiedades y dejar que el compilador genere ivars para usted) es una buena práctica. En teoría, sus archivos de encabezado solo deben exponer la interfaz pública para sus clases; Todo lo demás pertenece a la implementación.

Una advertencia es que los archivos iv de implementación no son visibles para las subclases, lo que en ocasiones puede ser un poco incómodo si ha generado manualmente los definidores y captadores que necesita subclases.

Estaba viendo el video de introducción de WWDC ARC y vi algo que nunca antes había visto en ObjC cuando un ingeniero de Apple habló sobre un ejemplo de Stack.

Se utilizó el siguiente código para un ejemplo de pila con ARC:

@implementation Stack { // instance variable declared in implementation context NSMutableArray *_array; } - (id)init { if (self = [super init]) _array = [NSMutableArray array]; return self; } - (void)push:(id)x { [_array addObject:x]; } - (id)pop { id x = [_array lastObject]; [_array removeLastObject]; return x; } @end

Tenga en cuenta la variable de instancia declarada justo después de la directiva @implementation .

Ahora lo que me sorprendió, es que una variable de instancia podría realmente declararse en el archivo de implementación, sin que sea una variable estática. Mis preguntas serían las siguientes:

  • ¿Se trata de una nueva construcción introducida en el SDK para iOS 5 o ha sido posible durante mucho tiempo?
  • ¿Sería una buena práctica declarar variables de instancia en la implementación, si no se puede acceder a las variables de instancia fuera del objeto? Parece mucho más limpio que el uso de la directiva @private.

Definir iVars dentro de la implementación es definitivamente una nueva construcción en el objetivo C. Necesita estar usando xcode4.2 y tener el compilador LLVM seleccionado en sus configuraciones de construcción. La idea es mantener sus archivos de cabecera más limpios. Puede enumerar sus ivars dentro de llaves como este ejemplo;

@implementation MyClass { int var1; int var2; }

La respuesta dada por Rahul no es realmente correcta, aunque puede aclarar las variables en la forma en que dice que el compilador las considerará estáticas. Probablemente para los casos en que los usó no importaba.


Soy nuevo en Objective C, y la práctica de declarar ivars en el encabezado es muy extraña. Significa declarar el estado interno de un objeto en su encabezado público, lo que desafía el concepto de encapsulación.

Por ejemplo, digamos que usted es dueño de un iPad. Apple no quiere que rompas el IPad para abrirlo y hacer palanca, y que juegues con los elementos del interior. Si quieren que modifiques algo, el iPad tendrá una configuración que te permitirá cambiar eso.

Del mismo modo, no quiero que otros programadores vean los archivos de mis objetos. Es el estado interno de mi objeto. Si quiero que accedas al estado interno, declararé propiedades para ello.

Entonces, como en otros idiomas, ocultaría mis archivos iv dentro del archivo de implementación, y no los declararía en el encabezado.

Declarar ivars en el encabezado me parece muy extraño. Esos ivars son específicos de la implementación, y simplemente no deben formar parte del archivo de encabezado.