Ich habe eine Klasse Film, in der jeder eine eindeutige ID speichert. In C #, Java usw. kann ich eine statische int currentID definieren und jedes Mal, wenn ich die ID einstelle, kann ich die currentID erhöhen und die Änderung erfolgt auf Klassenebene und nicht auf Objektebene. Kann dies in Objective-C durchgeführt werden? Ich habe es sehr schwer gefunden, eine Antwort darauf zu finden.
quelle
initialize
wird für jede Klasse einmal aufgerufen (Oberklassen vor Unterklassen), aber wenn eine Unterklasse nicht überschreibtinitialize
, wird die übergeordnete Klasseinitialize
erneut aufgerufen. Daher ist ein Schutz erforderlich, wenn dieser Code nicht zweimal ausgeführt werden soll. Siehe Initialisieren eines Klassenobjekts in den Objective-C-Dokumenten von Apple.Ab Xcode 8 können Sie Klasseneigenschaften in Obj-C definieren. Dies wurde hinzugefügt, um mit den statischen Eigenschaften von Swift zusammenzuarbeiten.
Hier ist ein Beispiel
Dann können Sie folgendermaßen darauf zugreifen:
Hier ist ein sehr interessanter erklärender Beitrag, den ich als Referenz verwendet habe, um diese alte Antwort zu bearbeiten.
2011 Antwort: (benutze das nicht, es ist schrecklich)
Wenn Sie wirklich wirklich keine globale Variable deklarieren möchten, gibt es eine andere Option, die vielleicht nicht sehr orthodox ist :-), aber funktioniert ... Sie können eine "get & set" -Methode wie diese mit einer statischen Variablen deklarieren:
Wenn Sie den Wert erhalten möchten, rufen Sie einfach an:
Und dann, wenn Sie es einstellen möchten:
Wenn Sie diese pseudostatische Variable auf null setzen möchten, können Sie Folgendes deklarieren
testHolder
:Und zwei praktische Methoden:
Ich hoffe es hilft! Viel Glück.
quelle
.m
Dateien aus nicht auf sie zugegriffen werden kann, und ich denke, es ist in Ordnung, wenn sie innerhalb derClass.m
Datei "global" ist .In Ihrer .m-Datei können Sie eine Variable als statisch deklarieren:
Dann können Sie es auf Ihrer
+(void)initialize
Methode initialisieren .Bitte beachten Sie, dass dies eine einfache statische C-Variable ist und nicht statisch im Sinne von Java oder C # ist, sondern ähnliche Ergebnisse liefert.
quelle
Deklarieren Sie in Ihrer .m-Datei eine globale Dateivariable:
Beachten Sie dann in Ihrer Init-Routine Folgendes:
oder wenn es zu einem anderen Zeitpunkt geändert werden muss (z. B. in Ihrer openConnection-Methode), erhöhen Sie es dort. Denken Sie daran, dass es nicht threadsicher ist. Sie müssen eine Synchronisierung durchführen (oder besser noch ein atomares Add verwenden), wenn Threading-Probleme auftreten können.
quelle
Wie pgb sagte, gibt es keine "Klassenvariablen", nur "Instanzvariablen". Die objektive Methode zum Ausführen von Klassenvariablen ist eine statische globale Variable in der .m-Datei der Klasse. Die "statische" stellt sicher, dass die Variable nicht außerhalb dieser Datei verwendet werden kann (dh nicht extern sein kann).
quelle
Hier wäre eine Option:
Beachten Sie, dass diese Methode die einzige Methode ist, um auf die ID zuzugreifen. Sie müssen sie daher in diesem Code irgendwie aktualisieren.
quelle
(Streng genommen keine Antwort auf die Frage, aber meiner Erfahrung nach wahrscheinlich nützlich bei der Suche nach Klassenvariablen)
Eine Klassenmethode kann oft viele der Rollen spielen, die eine Klassenvariable in anderen Sprachen spielen würde (z. B. geänderte Konfiguration während der Tests):
Nun wird ein Objekt der Klasse
MyCls
AnrufeResource:changeSomething:
mit der Zeichenfolge@"Something general"
auf einen AufrufdoTheThing:
, sondern ein Objekt , abgeleitet vonMySpecialCase
mit der Zeichenfolge@"Something specific"
.quelle
Sie können die Klasse in classA.mm umbenennen und C ++ - Funktionen hinzufügen.
quelle
Eine andere Möglichkeit wäre, einen kleinen
NSNumber
Singleton der Unterklasse zu haben .quelle