8

He visto ejemplos de código (del libro Beginning iPhone 4 Development) donde ambos declaran ivars dentro del bloque de interfaz y luego declaran propiedades para el mismo. De esta manera:Tiempo de ejecución moderno Objective-c utilizando propiedades y ivars en el bloque de interfaz

@interface ViewController : UIViewController { 
    UITableView *table; 
} 

@property (nonatomic, retain) IBOutlet UITableView *table; 

¿Cuál sería el propósito/beneficio de esto? Como entiendo, con la versión de tiempo de ejecución moderna (iPhone y aplicaciones de OS X de 64 bits) solo necesita declarar propiedades y puede dejar de declarar las ivars dentro del bloque de interfaz. De acuerdo con la respuesta this en un hilo similar sería con fines de depuración. Pero, ¿hay algún otro beneficio a excepción de la depuración que usaría este enfoque?

Saludos,

Peter

Respuesta

5

Ivars declaran explícitamente le da la posibilidad de utilizar internamente un tipo especializado de la Ivar.

Un ejemplo típico es un objeto internamente mutable al que se puede acceder desde el exterior de forma inamovible.

Ejemplo:

@interface Foo : NSObject 
@property (readonly) NSArray *bars; 
@end 

@implementation 
{ 
    NSMutableArray *bars; 
} 

@synthesize bars; 

- (void)addBar:(Bar *)bar 
{ 
    [bars addObject:bar]; 
} 
@end 

Por supuesto, el objeto devuelto por la propiedad bars en realidad no es inmutable. Pero el punto es que la API no revela su mutabilidad.

Tenga en cuenta que utilicé el nuevo y elegante estilo privado-ivars-en-implementación. Depende tanto del tiempo de ejecución moderno como del compilador de clang.

2

A algunos programadores les gusta definir sus iVars con un nombre ligeramente diferente para diferenciar entre acceso directo y acceso KVC. Por ejemplo:

en el .h

@interface ViewController : UIViewController { 
    UITableView *_table; 
} 

@property (nonatomic, retain) IBOutlet UITableView *table; 

y en el .m

@synthesize table = _table; 

esta manera se accede directamente a la Ivar usando _table pero utilizar los setters y getters sintetizados utilizando [self table]

+3

No es necesario declarar el ivar explícitamente para darle otro nombre que no sea la propiedad. '@synthesize foo = _foo;' declara el nombre implícitamente. –

1

¿Pero hay otros beneficios a excepción de la depuración que nos e este enfoque?

i declarar la ivars explícitamente:

  • de control de acceso (visibilidad)
  • organización
  • escrito uniforme estilo
  • compatibilidad (ojo, este programa podría apoyar 32 bits de un día)
  • y porque asocio propiedades como parte de la interfaz pública de la clase (aunque existen excepciones a esto) - no simplemente como acce ayuda a los ivars de la clase.

"todo como una propiedad de lectura/escritura" es fundamentalmente defectuoso.

Cuestiones relacionadas