Eiko i inni udzielili poprawnych odpowiedzi.
Oto prostszy sposób: bezpośredni dostęp do prywatnej zmiennej składowej.
Przykład
W pliku nagłówkowym .h:
@property (strong, nonatomic, readonly) NSString* foo;
W pliku .m implementacji:
self->_foo = @"someString";
To wszystko, to wszystko, czego potrzebujesz. Bez musów, bez zamieszania.
Detale
Począwszy od Xcode 4.4 i LLVM Compiler 4.0 ( nowe funkcje w Xcode 4.4 ), nie musisz zadzierać z obowiązkami omówionymi w innych odpowiedziach:
- Słowo
synthesize
kluczowe
- Deklarowanie zmiennej
- Ponowne zadeklarowanie właściwości w pliku .m implementacji.
Po zadeklarowaniu właściwość foo
, można założyć, Xcode dodała prywatną zmienną składową o nazwie z prefiksem podkreślenia: _foo
.
Jeśli właściwość została zadeklarowana readwrite
, Xcode generuje metodę pobierającą o nazwie foo
i metodę ustawiającą o nazwie setFoo
. Te metody są wywoływane niejawnie, gdy używasz notacji z kropką (my Object.myMethod). Jeśli właściwość została zadeklarowana readonly
, nie jest generowany żaden ustawiający. Oznacza to, że zmienna zapasowa, nazwana podkreśleniem, sama nie jest tylko do odczytu. Te readonly
środki, które po prostu nie sposób seter został zsyntetyzowany, a więc za pomocą notacji kropki ustawić wartość nie z błędu kompilatora. Notacja z kropką kończy się niepowodzeniem, ponieważ kompilator powstrzymuje Cię przed wywołaniem metody (ustawiającej), która nie istnieje.
Najprostszym sposobem obejścia tego jest bezpośredni dostęp do zmiennej składowej, nazwanej podkreśleniem. Możesz to zrobić nawet bez deklarowania zmiennej o nazwie podkreślonej! Xcode wstawia tę deklarację jako część procesu kompilacji / kompilacji, więc skompilowany kod rzeczywiście będzie zawierał deklarację zmiennej. Ale nigdy nie widzisz tej deklaracji w swoim oryginalnym pliku kodu źródłowego. Nie magia, tylko cukier syntaktyczny .
Używanie self->
to sposób na dostęp do zmiennej składowej obiektu / instancji. Możesz to pominąć i po prostu użyć nazwy var. Ale wolę używać self + arrow, ponieważ sprawia, że mój kod jest samodokumentujący. Gdy zobaczysz, self->_foo
że wiesz bez niejasności, _foo
jest to zmienna składowa w tej instancji.
Nawiasem mówiąc, omówienie zalet i wad udostępniające właściwości w porównaniu bezpośrednim dostępem Ivar jest dokładnie ten rodzaj przemyślany leczenia będziesz czytać w dr Matt Neuberg „s Programowanie iOS książki. Przeczytanie i ponowne przeczytanie okazało się bardzo pomocne.