Kiedy należy @synthesize
wyraźnie dodać do mojego kodu?
Ogólnie rzecz biorąc, jeśli jest to wymagane: prawdopodobnie nigdy nie trafisz na przypadek, w którym jest to potrzebne.
Jest jednak jeden przypadek, w którym może Ci się to przydać.
Załóżmy, że piszesz zarówno niestandardową metodę pobierającą, jak i ustawiającą, ale chcesz, aby zmienna instancji ją wspierała. (W przypadku właściwości atomowej jest to tak proste, jak potrzeba niestandardowego ustawiacza: kompilator zapisze metodę pobierającą, jeśli określisz metodę ustawiającą dla właściwości jednoatomowej, ale nie dla właściwości atomowej).
Rozważ to:
@interface MyObject:NSObject
@property (copy) NSString *title;
@end
@implementation MyObject
- (NSString *)title {
return _title;
}
- (void)setTitle:(NSString *)title {
_title = [title copy];
}
@end
To nie zadziała, ponieważ _title
nie istnieje. Określono zarówno metodę pobierającą, jak i ustawiającą, więc Xcode (poprawnie) nie tworzy dla niej zmiennej instancji zapasowej.
Masz dwie możliwości zaistnienia. Możesz zmienić na @implementation
to:
@implementation MyObject {
NSString *_title;
}
- (NSString *)title {
return _title;
}
- (void)setTitle:(NSString *)title {
_title = [title copy];
}
@end
Lub zmień to na:
@implementation MyObject
@synthesize title = _title;
- (NSString *)title {
return _title;
}
- (void)setTitle:(NSString *)title {
_title = [title copy];
}
@end
Innymi słowy, chociaż syntetyzacja nie jest nigdy konieczna do celów praktycznych *, może być używana do definiowania zmiennych instancji obsługujących właściwości, gdy udostępniasz metodę pobierającą / ustawiającą. Możesz zdecydować, którego formularza tutaj chcesz użyć.
W przeszłości preferowałem określanie zmiennej instancji w elemencie @implementation {}
, ale teraz uważam, że @synthesize
trasa jest lepszym wyborem, ponieważ usuwa nadmiarowy typ i wyraźnie wiąże zmienną zapasową z właściwością:
- Zmień typ właściwości, a typ zmiennej instancji ulegnie zmianie.
- Zmień jego kwalifikator magazynu (na przykład uczyń go słabym zamiast silnym lub silnym zamiast słabego) i zmieni się kwalifikator magazynu.
- Usuń lub zmień nazwę właściwości, a
@synthesize
spowoduje wygenerowanie błędu kompilatora. Nie skończysz z bezpańskimi zmiennymi instancji.
* - Znam jeden przypadek, w którym było to konieczne, związany z podziałem funkcji na kategorie w wielu plikach. I nie zdziwiłbym się, gdyby Apple to naprawił, a nawet już to zrobił.