2010-02-05 13 views
11

Ich habe den Code unten geschrieben geschrieben 3 verschiedene Möglichkeiten (in Bezug auf IBOutlet) Ist es wichtig, würde ich sagen, IBOutlet sowohl der Deklaration hinzufügen und die @property war prägnanter.IBOutlet-Deklarationen?

GERADE PROPERTY:

@class SwitchViewController; 

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

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

GERADE ERKLÄRUNG:

@class SwitchViewController; 

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

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

BEIDE:

@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 

prost gary

+0

@fuzzygoat: +1 Hatte die gleiche Frage im Hinterkopf, und hier war es. –

Antwort

7

sollte keine Rolle spielen. Mit den 10,6 64-Bit-SDK können Sie auch die Eigenschaft, ohne die Ivar schreiben:

@class SwitchViewController; 

@interface iPhone_switcherAppDelegate : NSObject <UIApplicationDelegate> { 
} 

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

IBOutlet tun nur Materie Interface. Für den Compiler, UINibDeclarations.h #define s es zu nichts.

InterfaceBuilder nimmt IBOutlet als einen Hinweis aus der Header-Datei, um die verfügbaren Steckdosen für die Klasse aufzulisten. Wenn Sie ein Objekt an eine IBOutlet anschließen, unabhängig davon, ob es als Eigenschaft oder Instanzvariable definiert ist, wird diese Information in die Schreibfeder geschrieben.

Beim Laden der Nib versucht der Loader den bestmöglichen Weg zum Aufbau der Verbindung zu finden: Zuerst wird versucht, eine Setter-Methode mit einem passenden Namen zu finden. Wenn kein solcher Setter gefunden wird, greift er direkt auf die Instanzvariable zurück, was ein schlechter Stil ist, da die Speicherverwaltung auf diese Weise nicht klar ist.

Alle Ihre vorgeschlagenen Beispiele haben eine Eigenschaft (und natürlich eine Setter-Methode) des richtigen Namens. In jedem Fall würde der Loader die Setter-Methode verwenden, unabhängig davon, wo das IBOutlet-Tag steht: Es gibt keinen Unterschied zwischen Ihren Beispielen, weder in der Nib noch in der Art, wie der Code ausgeführt wird.

Der beste Stil wäre, das IBOutlet Tag in die Eigenschaftendefinition zu setzen.

3

Der aktuelle Stil in Apples Beispielcode setzt das IBOutlet in die Eigenschaftsdeklaration. Aus Gründen der Konsistenz ist dies wahrscheinlich der beste Ort, um es zu werfen.

0

Ich fand auch diese Art und Weise (ohne Eigentum Erklärung):

@class SwitchViewController; 

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

@end 

Was ist das?

+0

Wie Nikolai weiter oben sagte, würde dies den Nib-Lader dazu bringen, die Instanzvariable direkt zu setzen, ohne eine Setter-Methode durchzugehen, was bedeutet, dass Ihre Klasse den Speicher dieser Variablen nicht mehr verwaltet (Ihr Code "behält" ihn nie). Erstellen Sie Eigenschaftenaccessor, um sicherzustellen, dass die Instanzen ordnungsgemäß beibehalten und freigegeben werden. –

+2

Ist dieser letzte Kommentar immer noch aktuell mit ARC? –