2010-02-05 16 views
11

Ho visto il codice qui sotto scritto in 3 modi diversi (per quanto riguarda IBOutlet). Importa, direi che aggiungere IBOutlet sia alla dichiarazione sia alla @property era più conciso.Dichiarazioni IBOutlet?

SOLO PROPRIETA ':

@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 DICHIARAZIONE:

@class SwitchViewController; 

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

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

ENTRAMBI:

@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 

applausi gary

+0

@fuzzygoat: +1 Aveva in mente la stessa domanda, ed eccola qui. –

risposta

7

non dovrebbe importare. Con il 10.6 a 64-bit SDK è anche possibile scrivere la proprietà senza l'Ivar:

@class SwitchViewController; 

@interface iPhone_switcherAppDelegate : NSObject <UIApplicationDelegate> { 
} 

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

IBOutlet fa solo questione InterfaceBuilder. Per il compilatore, UinibDeclarations.h #define s a nulla.

InterfaceBuilder richiede IBOutlet come suggerimento dal file di intestazione per elencare le uscite disponibili per la classe. Se si collega un oggetto a IBOutlet, indipendentemente dal fatto che sia definito come una proprietà o una variabile di istanza, questa informazione viene scritta nel pennino.

Durante il caricamento del pennino, il caricatore cerca di trovare il modo migliore per impostare la connessione: prima tenta di trovare un metodo setter con un nome appropriato. Se non viene trovato un setter di questo tipo, torna a impostare direttamente la variabile di istanza, che è di stile scadente, perché la gestione della memoria non è chiara in questo modo.

Tutti gli esempi proposti hanno una proprietà (e, naturalmente, un metodo setter) del nome giusto. Quindi, in ogni caso, il caricatore usa il metodo setter, indipendentemente da dove si trova il tag IBOutlet: Non c'è differenza tra i tuoi esempi, né nel pennino, né nel modo in cui il codice viene eseguito.

Lo stile migliore sarebbe inserire il tag IBOutlet nella definizione della proprietà.

3

Lo stile corrente nel codice di esempio di Apple inserisce IBOutlet nella dichiarazione di proprietà. Per coerenza, questo è probabilmente il miglior posto per lanciarlo.

0

Ho anche trovato in questo modo (senza alcuna dichiarazione di proprietà):

@class SwitchViewController; 

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

@end 

Che dire di questo?

+0

Come detto più a fondo Nikolai, ciò farebbe sì che il caricatore Nib imposti la variabile di istanza direttamente, senza passare attraverso un metodo setter, il che significa che la classe non gestisce più la memoria di queste variabili (il tuo codice non la "mantiene mai"). Crea accessors di proprietà per assicurarti che le istanze vengano correttamente mantenute e rilasciate. –

+2

Questo ultimo commento è ancora aggiornato con ARC? –