Jestem raczej zdezorientowany właściwościami i zmiennymi instancji w Objective-C.Właściwości i zmienne instancji w Objective-C
Jestem w połowie programu Aaro Hillegassa "Cocoa Programming dla Mac OS X" i wszystko jest logiczne. Można by zadeklarować klasę coś takiego:
@class Something;
@interface MyClass : NSObject {
NSString *name;
NSArray *items;
Something *something;
IBOutlet NSTextField *myTextField;
}
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSArray *items;
Ponieważ inne przedmioty potrzebne do manipulowania naszymi
name
iitems
instancji zmiennych, używamy@property
/@synthesize
wygenerować akcesorów/mutatorów dla nich. W naszej klasie nie używamy akcesorów/mutatorów - bezpośrednio interweniujemy ze zmienną instancji.something
to tylko zmienna instancji, której będziemy używać w naszej klasie, a ponieważ nikt inny nie musi jej używać, nie tworzymy dla niej pary akcesorów i mutatorów.Potrzebujemy interakcji z polem tekstowym w naszym interfejsie użytkownika, więc deklarujemy dla niego
IBOutlet
, łączymy go i gotowe.
Wszystko bardzo logiczne.
Jednak w świecie iPhone'a sprawy wyglądają inaczej. Użytkownicy deklarują właściwości dla każdej zmiennej pojedynczej instancji, deklarują właściwości dla IBOutlets
i używają akcesorów/mutatorów do interakcji ze zmiennymi instancji w obrębie klasy (np. Będą pisać [self setName:@"Test"]
zamiast name = @"Test"
).
Dlaczego? Co się dzieje? Czy te różnice są specyficzne dla iPhone'a? Jakie są zalety deklarowania właściwości dla wszystkich zmiennych instancji, deklarowania właściwości dla IBOutlets
i używania akcesorów/mutatorów w obrębie własnej klasy?
Dla kogoś w podobnej sytuacji: oprócz poniższych odpowiedzi, patrz http://stackoverflow.com/questions/1221516/does-an-iboutlet-needs- to-be-a-property-synthesized i http://stackoverflow.com/questions/1250518/what-happens-if-i-dont-retain-iboutlet z powodu dlaczego zadeklarowałbyś IBOutlety jako właściwości. –