2012-02-03 9 views
5

¿Cuál es la diferencia entre colocar variables de instancia pseudoprivadas en una extensión de clase dentro del archivo .m o ponerlas en los paréntesis @implementation recién presentados, como se muestra a continuación?¿Cuál es la diferencia entre agregar ivars pseudoprivadas en una extensión de clase o en el bloque @implementation?

¿Hay consecuencias, pros y contras en una u otra forma? ¿Internal2 se trata de forma diferente a internal3 de una manera que debe preocuparse por un programador? (Por supuesto que hay una diferencia que McKay diría, pero la pregunta es si te importa en la práctica o no).

// MyClass.m 

@interface MyClass() { 
    id internal2; 
} 
@end 


@implementation MyClass { 
    id internal3; 
} 

- (void)internalMethod { 
    NSLog(@"%@ %@", internal2, internal3); 
} 

@end 

fuente: http://www.mcubedsw.com/blog/index.php/site/comments/new_objective-c_features/

Respuesta

9

La principal diferencia entre los dos enfoques es que puede incluir la extensión de clase en un encabezado separado, mientras que los ivars de implementación obviamente tienen que ir con el bloque @implementation en el archivo .m (y solo puede haber uno @implementation para una clase dada (extensiones no incluidas)). El resultado práctico de esto es que usted puede tener múltiples niveles de Ivars "privadas":

  • MyClass.h: Ivars públicas
  • MiClase + Private.h: Ivars semi-privadas
  • MyClass.m: ivars realmente privados

Como un ejemplo hipotético, pretende que MyClass es UIView. En ese caso, UIView.h es el encabezado al que todos podemos acceder, UIView + Private.h es el encabezado "privado" al que solo Apple puede acceder, y UIView.m tiene cosas que solo las personas específicamente responsables de UIView necesitan saber acerca de.

+2

Las clases pueden tener más de un bloque de implementación. Es la base de las extensiones de clase. –

+0

Sí, por supuesto. Pero sin incluir categorías, una sola clase solo puede tener una @implementación. – UIAdam

+1

@EllNeal: Categoría '@ implementation's! = Clase' @ implementation's –

3

Personalmente, prefiero poner mis Ivars en una sola extensión de clase en el archivo de implementación, creo que es más limpio de esa manera. No creo que haya ventajas de rendimiento o consecuencias al usar una u otra, se trata más bien de poder codificar de la manera que desee.

Cuestiones relacionadas