2010-02-05 12 views
11

He visto el siguiente código escrito de 3 maneras diferentes (con respecto a IBOutlet) ¿Importa, yo diría que agregar IBOutlet a la declaración y la @property fue más conciso.declaraciones de IBOutlet?

SOLO LA PROPIEDAD:

@class SwitchViewController; 

@interface iPhone_switcherAppDelegate : NSObject <UIApplicationDelegate> { 
    UIWindow *window; 
    SwitchViewController *switchViewController; 
} 

@property(nonatomic, retain) IBOutlet UIWindow *window; 
@property(nonatomic, retain) IBOutlet SwitchViewController *switchViewController; 
@end 

SOLO DECLARACIÓN:

@class SwitchViewController; 

@interface iPhone_switcherAppDelegate : NSObject <UIApplicationDelegate> { 
    IBOutlet UIWindow *window; 
    IBOutlet SwitchViewController *switchViewController; 
} 

@property(nonatomic, retain) UIWindow *window; 
@property(nonatomic, retain) SwitchViewController *switchViewController; 
@end 

AMBOS:

@class SwitchViewController; 

@interface iPhone_switcherAppDelegate : NSObject <UIApplicationDelegate> { 
    IBOutlet UIWindow *window; 
    IBOutlet SwitchViewController *switchViewController; 
} 

@property(nonatomic, retain) IBOutlet UIWindow *window; 
@property(nonatomic, retain) IBOutlet SwitchViewController *switchViewController; 
@end 

aplausos gary

+0

@fuzzygoat: +1 Tenía la misma pregunta en mente, y aquí estaba. –

Respuesta

7

no debería importar. Con el SDK 10.6 de 64 bits también se puede escribir la propiedad sin el Ivar:

@class SwitchViewController; 

@interface iPhone_switcherAppDelegate : NSObject <UIApplicationDelegate> { 
} 

@property(nonatomic, retain) IBOutlet UIWindow *window; 
@property(nonatomic, retain) IBOutlet SwitchViewController *switchViewController; 
@end 
11

IBOutlet hace sólo la materia a InterfaceBuilder. Para el compilador, UINibDeclarations.h #define s es a nada.

InterfaceBuilder toma IBOutlet como una pista del archivo de encabezado para listar las salidas disponibles para la clase. Si conecta un objeto a un IBOutlet, sin importar si está definido como una propiedad o una variable de instancia, esta información se escribe en el plumín.

Al cargar el plumín, el cargador intenta encontrar la mejor manera posible de configurar la conexión: Primero trata de encontrar un método de fraguado con un nombre apropiado. Si no se encuentra ningún setter, se vuelve a establecer directamente la variable de instancia, que es un estilo pobre, porque la administración de memoria no está clara de esta manera.

Todos sus ejemplos propuestos tienen una propiedad (y, por supuesto, un método setter) del nombre correcto. Entonces, en cada caso, el cargador usaría el método setter, sin importar dónde esté la etiqueta IBOutlet: no hay diferencia entre sus ejemplos, ni en el plumín, ni en la forma en que se ejecuta el código.

El mejor estilo sería poner la etiqueta IBOutlet en la definición de propiedad.

3

El estilo actual en el código de ejemplo de Apple pone IBOutlet en la declaración de propiedad. Por coherencia, ese es probablemente el mejor lugar para tirarlo.

0

También encontré esta manera (sin ningún tipo de declaración de propiedad):

@class SwitchViewController; 

@interface iPhone_switcherAppDelegate : NSObject <UIApplicationDelegate> { 
    IBOutlet UIWindow *window; 
    IBOutlet SwitchViewController *switchViewController; 
} 

@end 

¿Y esto?

+0

Como dijo Nikolai más arriba, esto haría que el cargador Nib establezca la variable de instancia directamente, sin pasar por un método setter, lo que significa que su clase ya no administra la memoria de estas variables (su código nunca "la conserva"). Cree accesos a propiedades para asegurarse de que las instancias se conservan y liberan correctamente. –

+2

¿Este último comentario todavía está actualizado con ARC? –

Cuestiones relacionadas