Was macht var
eigentlich tun, und warum nicht einstellen myObject = null
eigentlich das Objekt entfernen? Diese Fragen knüpfen an ein grundlegendes Konzept in der Codierung an, das relevant ist, ob Ihre bevorzugte Sprache AS3, JavaScript oder C # ist, und kann anhand einiger allgemeiner Elemente aus dem Schreibwarenschrank verstanden werden.
Beginnen wir mit den Grundlagen. Angenommen, Sie möchten das Alter Ihres Freundes Bill speichern:
var ageOfBill: Number = 24;
(Ich werde AS3 für dieses Beispiel verwenden, aber die grundlegenden Konzepte sind in JavaScript und C # gleich..
In JavaScript ist die Syntax fast identisch, aber wir geben nicht an, dass Alter eine Zahl ist:
var ageOfBill = 24;
In C # verwenden wir das nicht var
Schlüsselwort, aber wir geben den Typ der Variablen an:
kurz ageOfBill = 24;
Nicht anders genug, um verwirrend zu sein, hoffe ich.
Was ist also hier los? Denk darüber so:
var
(oder kurz
, in C #) bedeutet "eine frische Post-it-Notiz erhalten".ageOfBill
bedeutet "schreiben" ageOfBill
über die Spitze, in Stift ".= 24
bedeutet "schreiben" 24
auf dem Zettel mit Bleistift ".Was ist, wenn wir später erkennen, dass Bill tatsächlich jünger ist als wir dachten??
var ageOfBill = 24; //… später… ageOfBill = 20;
Das heißt nur, wir finden unsere ageOfBill
beachten Sie, löschen 24
, und schreibe 20
stattdessen darauf.
Wir könnte schreiben var
nochmal:
var ageOfBill: Number = 24; //… später… var ageOfBill: Number = 20;
… Aber das ist kein guter Code, weil var
sagt, "erhalten Sie eine frische Post-it-Notiz". Wenn Sie dies tun, wird der Compiler normalerweise herausfinden, was Sie meinen, d. H. Sie möchten ändern, was auf dem vorhandenen geschrieben wird ageOfBill
Post-it-Note, anstatt tatsächlich eine neue zu bekommen - aber es wird sich wahrscheinlich beklagen.
Warnung: # 3596: Doppelte Variablendefinition.
Das hängt von der Sprache und von Ihrer Programmierumgebung ab.
Können wir den Compiler also bitten, eine neue Post-it-Notiz zu bekommen und ein Etikett mit einem Stift darauf zu schreiben, ohne etwas mit Bleistift darauf zu schreiben? Vielleicht könnten wir das für Bills Freund Marty tun, dessen Alter wir nicht kennen:
var ageOfMarty: Anzahl;
Eigentlich (zumindest in AS3) wird dies eine neue Post-it-Note erhalten, schreiben ageOfMarty
oben, in Stift ... und dann einen Standard-Anfangswert von schreiben 0
dort mit Bleistift:
Mit anderen Worten, wir können eine solche Post-it-Notiz nicht haben, ohne dass sie einen Wert annimmt.
Okay - was ist, wenn wir das Alter von Bills besten Freund Ted speichern möchten, von dem wir wissen, dass er gleich alt ist?
var ageOfTed: Anzahl = ageOfBill;
Was hier passiert ist, der Computer schaut das an ageOfBill
Post-it kopiert dann die darauf mit Bleistift geschriebene Nummer in ein frisches Post-it, auf das es schreibt ageOfTed
über die Spitze in Stift.
Dies ist jedoch nur eine Kopie. wenn wir dann den Wert von ändern ageOfBill
es wird sich nicht auswirken ageOfTed
:
ageOfBill = 21;
So! Das ist alles ziemlich unkompliziert und vielleicht sogar intuitiv. Sprechen wir jetzt über den ersten gemeinsamen Schmerzpunkt: Arrays.
Stellen Sie sich ein Array als Ringbuch vor.
(Ich wollte einen Rolodex sagen ...
… Aber mir wurde klar, dass ich noch nie einen gesehen habe.)
Jedes Blatt in der Mappe ist wie eine dieser Post-it-Notizen, es sei denn, das Stiftetikett befindet sich auf der Oberseite. Stattdessen beziehen wir uns auf jedes Blatt mit dem Namen der Mappe und der Seitennummer des Blattes.
Nehmen wir an, wir haben alle unsere Freunde in einer bestimmten Reihenfolge. Wer ist auf der ersten Seite (Seite # 0)?
Spur (Freunde [0]);
(Spur()
schreibt einfach die Zeile in die Debug-Ausgabe; in JavaScript können Sie verwenden console.log ()
und in C # könnten Sie verwenden Console.WriteLine ()
aus demselben Grund.)
Es ist Bill!
Nun, was macht die folgende Zeile??
var firstFriend: String = Freunde [0];
Es bekommt eine frische Post-it-Note (wegen der var
Stichwort), schreibt erster Freund
über dem oberen Rand mit Stift und kopiert dann alles, was auf der ersten Seite der Mappe steht, auf die Notiz mit Bleistift.
(Merken, String
bedeutet nur ein Stück Text.)
Wir können das überschreiben, was auf jeder Seite der Mappe geschrieben ist, genau wie bei den Post-it-Notizen:
Freunde [0] = "Kyle";
… Und das wirkt sich natürlich nicht auf die erster Freund
Veröffentliche es.
Die Sammelmappe ist eine passende Analogie, da Sie - wie bei einem Array - Seiten herausnehmen, neue hinzufügen und neu anordnen. Denken Sie jedoch daran, dass einzelne Seiten genau wie die Post-it-Notizen funktionieren, es sei denn, sie haben keine eigenen Stiftbeschriftungen, nur Seitennummern.
Immer noch recht unkompliziert, hoffe ich. Hier also eine interessante Frage: Was passiert, wenn Sie Folgendes tun??
var listOfNames: Array = Freunde;
Äh…
Ich habe hier ein bisschen geschummelt, weil ich eine Menge über Arrays gesprochen habe, ohne zu erklären, wie wir überhaupt einen erstellen. Lasst uns das jetzt angehen.
Angenommen, Sie geben Folgendes ein:
var Freunde: Array = ["Bill", "Marty", "Ted"];
… Was geschieht?
Nun wie immer, Var Freunde
bedeutet, wir bekommen eine frische Post-it-Notiz und schreiben Freunde
über die Spitze, in Stift:
Aber was schreiben wir mit Bleistift darauf??
Es ist eine Trickfrage: Wir schreiben nicht etwas.
Sehen, Array
bedeutet "einen neuen Ringordner erhalten". Und ["Bill", "Marty", "Ted"]
bedeutet "drei Seiten in die Mappe mit diesen Namen legen":
Und dann? Es ist einfach! Wir halten die Freunde
Haftnotiz auf dem Einband der Sammelmappe:
Wenn wir jetzt schreiben:
Spur (Freunde [0]);
… Wir wissen, dass wir das Post-it-Label finden müssen Freunde
, Sehen Sie sich dann an, was auf der ersten Seite (Seite # 0) des Ordners, an dem es haftet, geschrieben wurde.
Es gibt tatsächlich sehr wenige Variablentypen, bei denen ein Wert mit Bleistift auf eine Post-it-Notiz geschrieben wird. In AS3 sind die einzigen derartigen Typen (als "Primitive" bezeichnet):
Nummer
String
int
uint
Boolean
Für alles andere - Objekt
, Filmausschnitt
, XML
, und so weiter - wir kleben den Post-it-Zettel auf den Artikel selbst.
(Die Details unterscheiden sich in JavaScript und C # ein wenig, insgesamt gilt jedoch dieselbe Idee.)
Kommen wir also zu unserer früheren Frage zurück. Wenn wir schreiben:
var listOfNames: Array = Freunde;
… was geschieht?
Wieder wissen wir das var listOfNames
bedeutet "erhalten Sie eine frische Post-it-Notiz und schreiben Sie listOfNames
über der Spitze in Stift ". Und jetzt wissen wir das Array
bedeutet, dass wir die Post-it-Notiz an etwas (eine Mappe) kleben, anstatt etwas mit Bleistift auf das Post-it zu schreiben.
Wenn wir zuvor etwas Ähnliches gemacht haben, haben wir den Inhalt einer Post-it-Notiz auf eine andere kopiert. Sollten wir also hier einen neuen Ordner erhalten und alle Seiten aus dem Ordner kopieren? Freunde
Binder hinein?
Nicht wirklich! Alles, was wir tun, ist das Neue zu kleben listOfNames
Haftnotiz auf derselben Mappe wie die Freunde
Post-it Notiz.
Jetzt, Freunde
und listOfNames
jeweils beziehen sich auf die genau das gleiche Array. Also wenn wir schreiben:
listOfNames [0] = "Emmett";
… dann Freunde [0]
werden ebenfalls Sein Emmett
, da listOfNames [0]
und Freunde [0]
beziehen Sie sich auf die gleiche Seite in der gleichen Mappe! Und da diese Seite nur einen String enthält (was ein "primitiver" Typ ist, denken Sie daran), haben wir alles, was zuvor auf dieser Seite geschrieben und geschrieben wurde, gelöscht Emmett
stattdessen dort.
Null
Bedeuten?So gesehen, Null
ist ganz leicht zu verstehen. Diese Aussage:
Freunde = Null;
… Bedeutet nur "entferne die Freunde
Post-it-Notiz von dem, an dem es gerade haftet ".
Das Freunde
Post-it noch existiert, es bleibt einfach bei nichts hängen. Wenn Sie also Folgendes eingeben:
Spur (Freunde [0]);
oder
Freunde [0] = "Henry";
… Dann erhalten Sie eine Fehlermeldung, weil Sie versuchen, auf die erste Seite des Ordners zu verweisen, auf die der Ordner verweist Freunde
Post-it bleibt dran - aber nichts!
Um klar zu sein, Einstellung Freunde = Null
wirkt sich nicht auf den Ordner aus. Sie können immer noch gut via listOfNames
. Und Sie können sogar Folgendes eingeben:
friends = listOfNames;
... um zur alten Situation zurückzukehren:
Wie ich schon sagte, Einstellung Freunde = Null
wirkt sich nicht direkt auf die Sammelmappe aus, kann aber eine indirekt bewirken.
Wenn überhaupt keine Post-it-Notizen an der Sammelmappe hängen, kann niemand mehr auf die Sammelmappe zugreifen. Es wird einfach herumliegen, völlig unzugänglich. Alle diese Ordner (und andere Objekte) herumliegen zu lassen, ist jedoch eine wirkliche Verschwendung von Platz - sie verstopfen den Computerspeicher.
Dort ist das Müllsammler kommt herein. Dies ist ein Werkzeug, das regelmäßig nach "verlorenen" Objekten sucht und sie in den Papierkorb wirft. Sobald sie weg sind, sind sie endgültig verschwunden. Wenn ein Array Müll gesammelt wird, sind dies auch alle Seiten.
Für die meisten praktischen Zwecke betrifft dies Sie überhaupt nicht; Objekte werden nur dann gesammelt, wenn sie verloren gehen und von Ihrem Code nicht gefunden werden können. Wenn Sie viele davon herumliegen, bemerken Sie gelegentlich eine leichte Verzögerung, wenn der Garbage Collector seine Arbeit erledigt (es dauert etwas Zeit, den Müll aktiv zu sammeln). Der Vorteil ist, dass dadurch mehr Platz (Speicher) für Ihre App entsteht.
(Wenn Sie mehr zu diesem Thema erfahren möchten, lesen Sie die Beiträge von Daniel Sidhion zur Garbage Collection und zum Objekt-Pooling.)
Okay, es gibt noch ein großes Konzept - und es ist das bisher komplexeste.
Betrachten Sie diesen Ausschnitt:
var firstFriendDetails: Array = ["Bill", 20]; var secondFriendDetails: Array = ["Marty", 16]; var thirdFriendDetails: Array = ["Ted", 20]; var allFriends: Array = [firstFriendDetails, secondFriendDetails, thirdFriendDetails];
Wie geht es dir? Das Arbeit?
Beginnen wir mit dem, was wir wissen. Die ersten drei Zeilen sind einfach; für jeden wir:
Wie für diese Zeile:
var allFriends: Array = [firstFriendDetails, secondFriendDetails, thirdFriendDetails];
… Wir brauchen etwas Schnur und etwas Band.
Wir können uns vorstellen, dass diese eine Zeile diesem Snippet entspricht:
var allFriends: Array = []; allFriends [0] = firstFriendDetails; allFriends [1] = secondFriendDetails; allFriends [2] = dritteFreundDetails;
Die erste Zeile ist einfach: Holen Sie sich einen frischen Ordner und eine frische Post-it-Notiz, schreiben Sie Alle Freunde
auf dem Post-it-Zettel, und kleben Sie ihn auf die Mappe.
Wie für die zweite Zeile:
allFriends [0] = firstFriendDetails;
Denken Sie daran, dass ich sagte, dass jede Seite in einer Mappe wie eine Post-it-Notiz aussieht, es sei denn, dies ist alles ohne Stift. Wenn die erste Seite ein Post-it war, kleben wir sie einfach auf die Vorderseite der firstFriendDetails
Ordner rechts?
… Aber es kann nicht beides auf der Vorderseite dieses Ordners sein und in der anderen Mappe. Stattdessen verwenden wir string:
Gleiches für die anderen beiden:
Also wenn wir wissen wollen was allFriends [2]
bezieht sich auf, wir öffnen nur die Alle Freunde
Binder auf diese Seite und folgen Sie der Zeichenfolge - was natürlich dazu führt dritteFreundDetails
Bindemittel.
Ebenso für allFriends [1] [0]
, Wir finden zuerst heraus, welcher Ordner allFriends [1]
verweist auf und dann schauen wir uns die erste Seite von an Das Mappe… so allFriends [1] [0]
ist Marty
!
Jetzt fügen Sie all diese Informationen zusammen und denken Sie daran, wenn Sie diesen Ausschnitt lesen:
var Freunde: Array = ["Bill", "Marty", "Ted", "Emmett", "Henry"]; var currentIndex: int = 0; var currentFriend: String; while (currentIndex < 5) currentFriend = friends[currentIndex]; trace(currentFriend); var lastFriend:String = currentFriend; trace(lastFriend);
Was ist, wenn wir den Wert von ändern aktuellerFreund
in der Schleife?
var Freunde: Array = ["Bill", "Marty", "Ted", "Emmett", "Henry"]; var currentIndex: int = 0; var currentFriend: String; while (currentIndex < 5) currentFriend = friends[currentIndex]; currentFriend = "Herbert"; trace(currentFriend); trace(friends[0]);
Was ist, wenn das Array nicht-primitive Objekte enthält (MovieClips, Bilder, Arrays, 3D-Objekte oder was auch immer)??
var friends: Array = [erster Freund, zweiter Freund, dritter Freund, vierter Freund, fünfter Freund]; var currentIndex: int = 0; var currentFriend: MovieClip; // oder ": Image" oder ": Object" oder ": Array" oder wie auch immer (currentIndex < 5) currentFriend = friends[currentIndex]; currentFriend = sixthFriend; //What is the value of friends[0] now?
Was ist schließlich, wenn das Array andere Arrays enthält, die selbst Grundelemente enthalten?
var firstFriendDetails: Array = ["Bill", 20]; var secondFriendDetails: Array = ["Marty", 16]; var thirdFriendDetails: Array = ["Ted", 20]; var fourthFriendDetails: Array = ["Emmett", 50]; var 5thFriendDetails: Array = ["Henry", 36]; var friends: Array = [ersteFreundDetails, zweiteFriendDetails, dritteFriendDetails, vierteFriendDetails, fünfteFriendDetails]; var currentIndex: int = 0; var currentFriend: Array; while (currentIndex < 5) currentFriend = friends[currentIndex]; currentFriend[0] = "John"; currentFriend = ["Herbert", 29];
Was denkst du über den Wert von Freunde [3] [0]
wird danach sein?
Hier sind ein paar andere wichtige Hinweise, die Sie kennen sollten:
In AS3 und JavaScript ähneln Objekte Arrays, mit der Ausnahme, dass auf jede Seite ein Label und nicht auf die Seitennummer verweist. Sie können also Folgendes eingeben:
var detailsOfBill: Object = ; // "" bedeutet "Objekt erstellen" detailsOfBill.title = "Esquire"; detailsOfBill.bandName = "Wyld Stallyns"; detailsOfBill.allNames = ["Bill", "S.", "Preston"];
… und das ist So'ne Art wie ein frisches Binder bekommen, a detailsOfBill
Post-it auf der Vorderseite und Füllen mit drei Seiten. Die erste Seite hat das Etikett Titel
Oben in Stift und Wort geschrieben Esquire
mit Bleistift darauf geschrieben; Die zweite Seite hat das Etikett Band-Name
in Stift und Wyld Stallyns
in Bleistift Die dritte Seite hat das Etikett allNames
hat aber nichts mit Bleistift darauf geschrieben; Stattdessen wird sie mit einem String an einen anderen Ordner gebunden, dessen Seiten nicht beschriftet sind: Die erste Seite sagt Rechnung
, der zweite sagt S.
, und der dritte sagt Preston
, alles in bleistift.
(Um die Dinge noch verwirrender zu machen, sind Arrays technisch eine spezielle Form von Object. Wenn Sie denken, dass dies schlecht ist, können Funktionen auch als eine Art von Object betrachtet werden! Aber das ist ein Thema für einen zukünftigen Artikel…)
Ich sagte, dass Objekte Müll gesammelt werden, wenn sie keine Post-it-Notizen haben, aber dies ist eine Vereinfachung. Wenn eine Seite eines Binders über eine Zeichenfolge auf ein Objekt verweist (d. H. Wenn meinArray [0] = meinObjekt
oder ähnliches), dann wird das Objekt nicht als Müll gesammelt. Dasselbe gilt, wenn eine Seite eines Ordners auf einen anderen Ordner (Array) verweist oder wenn die Seite eines Objektordners auf einen anderen Objektordner verweist ... und so weiter. Dies gilt sogar, wenn der Zugriff auf das Objekt nur über ein Post-it möglich ist, das an eine Sammelmappe geklebt wird, deren eine Seite an eine andere Sammelmappe gebunden ist, und zwar so viele Ebenen, wie Sie möchten.
Grundsätzlich sammelt der Garbage Collector einen Artikel nur, wenn er nicht durch eine andere Variable erreicht werden kann.
Dies erklärt, warum Objekte, die sich auf dem Bildschirm befinden, normalerweise nicht erfasst werden können. Wenn sich in AS3 ein MovieClip oder ein anderer DisplayObject-Typ in der Anzeigeliste befindet, wird er automatisch zu einem im Wesentlichen verborgenen Array von Anzeigeobjekten hinzugefügt (auf das Sie über getChildAt () zugreifen können). Ähnliche Strukturen gibt es in JavaScript und C #. Wenn sich also eine Grafik auf dem Bildschirm befindet und Sie alle Verweise auf sie aus Variablen, Arrays und Objekten entfernen, wird sie immer noch nicht erfasst, solange Sie sie nicht aus der Anzeigeliste entfernen.
Ich hoffe, das hilft, die Dinge zu klären. Es ist sicherlich ein verwirrendes Konzept, wenn Sie zum ersten Mal darauf stoßen: Einige Variablen enthalten tatsächlich ein Wert, während andere nur eine enthalten Referenz zu einem Objekt. Machen Sie sich keine Sorgen, wenn Sie nicht genau wissen, was los ist. Nach ein bisschen Übung (und ein paar Fehlern!) wird es viel sinnvoller..
Wenn Sie jedoch konkrete Fragen dazu haben, schreiben Sie unten einen Kommentar und ich werde mein Bestes geben, um zu antworten.
Danke fürs Lesen!