Mam klasę Film, w której każdy przechowuje unikalny identyfikator. W C #, Javie itp. Mogę zdefiniować statyczny currentID int i za każdym razem, gdy ustawiam ID, mogę zwiększyć currentID, a zmiana następuje na poziomie klasy, a nie na poziomie obiektu. Czy można to zrobić w Objective-C? Bardzo trudno było mi znaleźć odpowiedź na to pytanie.
źródło
initialize
jest wywoływana raz dla każdej klasy (nadklasy przed podklasami), ale jeśli podklasa nie nadpisujeinitialize
, klasa nadrzędnainitialize
zostanie wywołana ponownie. Dlatego strażnik jest wymagany, jeśli nie chcesz, aby kod był wykonywany dwukrotnie. Zobacz Inicjowanie obiektu klasy w dokumentach Apple Objective-C.Począwszy od Xcode 8, można zdefiniować właściwości klasy w Obj-C. Zostało to dodane, aby współdziałać ze statycznymi właściwościami Swift.
Oto przykład
Następnie możesz uzyskać do niego dostęp w następujący sposób:
Oto bardzo interesujący post wyjaśniający, którego użyłem jako odniesienia do edycji tej starej odpowiedzi.
Odpowiedź z 2011 roku: (nie używaj tego, to straszne)
Jeśli naprawdę nie chcesz deklarować zmiennej globalnej, istnieje inna opcja, może niezbyt ortodoksyjna :-), ale działa ... Możesz zadeklarować metodę "get & set" w ten sposób, ze zmienną statyczną w środku:
Więc jeśli chcesz uzyskać wartość, po prostu zadzwoń:
A potem, kiedy chcesz to ustawić:
W przypadku, gdy chcesz mieć możliwość ustawienia tej pseudo-statycznej-zmiennej na nil, możesz zadeklarować
testHolder
następująco:Oraz dwie przydatne metody:
Mam nadzieję, że to pomoże! Powodzenia.
źródło
.m
plików i myślę, że dobrze jest, aby była „globalna” wClass.m
pliku.W swoim pliku .m możesz zadeklarować zmienną jako statyczną:
Następnie możesz zainicjować go w swojej
+(void)initialize
metodzie.Zwróć uwagę, że jest to zwykła zmienna statyczna C i nie jest statyczna w sensie, w jakim rozważają ją Java lub C #, ale da podobne wyniki.
źródło
W swoim pliku .m zadeklaruj globalną zmienną pliku:
następnie w swojej procedurze init, pamiętaj, że:
lub jeśli zajdzie potrzeba zmiany w innym czasie (np. w metodzie openConnection), zwiększ ją tam. Pamiętaj, że nie jest to bezpieczne dla wątków, ponieważ jest, musisz wykonać synchronizację (lub jeszcze lepiej, użyć dodatku atomowego), jeśli mogą wystąpić problemy z wątkami.
źródło
Jak powiedział pgb, nie ma „zmiennych klasowych”, tylko „zmienne instancji”. Metoda Object-C zmiennych klasowych to statyczna zmienna globalna wewnątrz pliku .m klasy. „Statyczna” zapewnia, że zmienna nie może być używana poza tym plikiem (tj. Nie może być extern).
źródło
Oto opcja:
Zauważ, że ta metoda będzie jedyną metodą dostępu do identyfikatora, więc będziesz musiał ją jakoś zaktualizować w tym kodzie.
źródło
(Ściśle mówiąc nie jest to odpowiedź na pytanie, ale z mojego doświadczenia wynika, że może być przydatna podczas wyszukiwania zmiennych klasowych)
Metoda klasowa może często odgrywać wiele ról, jakie zmienna klasowa pełniłaby w innych językach (np. Zmieniona konfiguracja podczas testów):
Teraz obiekt klasy
MyCls
wywołujeResource:changeSomething:
ciąg znaków@"Something general"
po wywołaniudoTheThing:
, ale obiekt wywodzący sięMySpecialCase
z ciągu@"Something specific"
.źródło
Możesz zmienić nazwę klasy na classA.mm i dodać do niej funkcje C ++.
źródło
Inną możliwością byłoby posiadanie małego
NSNumber
singletona podklasy.źródło