2010-02-05 10 views
11

Widziałem poniższy kod napisany na 3 różne sposoby (w odniesieniu do IBOutlet) Czy to ważne, chciałbym powiedzieć, dodając IBOutlet zarówno do deklaracji i @ dziedziczenia był bardziej zwięzły.Deklaracje IBOutlet?

WŁAŚNIE 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 

WŁAŚNIE OŚWIADCZENIE:

@class SwitchViewController; 

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

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

Both:

@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 

okrzyki Gary

+0

@fuzzygoat: +1 Miałem to samo pytanie, i oto było. –

Odpowiedz

7

nie powinno mieć znaczenia. Dzięki 64-bitowej SDK 10.6 można również napisać właściwość bez ivar:

@class SwitchViewController; 

@interface iPhone_switcherAppDelegate : NSObject <UIApplicationDelegate> { 
} 

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

IBOutlet nie tylko kwestia do InterfaceBuilder. Dla kompilatora, UINibDeclarations.h #define s to nic.

InterfaceBuilder pobiera IBOutlet jako wskazówkę z pliku nagłówkowego, aby wyświetlić listę dostępnych punktów sprzedaży dla tej klasy. Jeśli podłączysz obiekt do obiektu IBOutlet, bez względu na to, czy jest on zdefiniowany jako właściwość czy zmienna instancji, informacja ta jest zapisywana w stalówce.

Podczas ładowania stalówki, program ładujący próbuje znaleźć najlepszy możliwy sposób ustawienia połączenia: Najpierw próbuje znaleźć metodę ustawiającą o odpowiedniej nazwie. Jeśli nie zostanie znaleziony taki program ustawiający, powraca on do bezpośredniego ustawiania zmiennej instancji, co jest kiepskim stylem, ponieważ zarządzanie pamięcią nie jest jasne w ten sposób.

Wszystkie proponowane przykłady mają właściwość (i, oczywiście, metodę ustawiającą) o odpowiedniej nazwie. Tak więc w każdym przypadku program ładujący użyłby metody ustawiającej, niezależnie od tego, gdzie znajduje się znacznik IBOutlet: Nie ma różnicy między przykładami, ani w końcówce, ani w sposobie wykonywania kodu.

Najlepszym stylem byłoby umieszczenie znacznika IBOutlet w definicji właściwości.

3

Obecny styl w przykładowym kodzie Apple umieszcza IBOutlet w deklaracji właściwości. Dla spójności jest to prawdopodobnie najlepsze miejsce do rzucenia.

0

Znalazłem też w ten sposób (bez jakiegokolwiek oświadczenia własności):

@class SwitchViewController; 

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

@end 

Co na ten temat?

+0

Tak, jak powiedział Nikolai, to spowoduje to, że program ładujący Nib ustawi zmienną instancji bezpośrednio, bez przechodzenia przez metodę ustawiającą, co oznacza, że ​​klasa nie zarządza już pamięcią tych zmiennych (twój kod nigdy go "nie zachowuje"). Utwórz obiekty uzupełniające właściwości, aby upewnić się, że instancje zostały poprawnie zachowane i zwolnione. –

+2

Czy ten ostatni komentarz jest wciąż aktualny z ARC? –

Powiązane problemy