Löschen von Objekten in v15In JSL kann ich eine Klasse definieren und sie als Vorlage zum Instanziieren von Objekten verwenden.
Wie lösche ich das Objekt?
Ich habe die Nachricht deleteClass verwendet, davon ausgegangen, dass es sich um eine leichte Fehlbezeichnung handelt und das Objekt tatsächlich gelöscht wird.
Aber in Version 15 scheint es wirklich die Klasse zu löschen.Sobald ich die Nachricht verwende, kann ich keine weiteren Instanzen der Klasse erstellen.
Ich kann eine Löschnachricht verwenden, aber ich denke, es ist nur ein Alias für deleteClass, und ich habe das gleiche Problem.
Ist delete class wirklich dazu gedacht, die gesamte Klassendefinition zu löschen?Wenn ja, wie lösche ich das Objekt richtig?
Hier ist ein einfaches Testskript:
names default to here(1);
defineClass("MyClass",{
_value = .,
_init_ = method({value},
_value = value;
),
getValue = method({},
return(_value)
)
});
// this works
obj = newObject( MyClass( 10 ) );
show(obj:getvalue);
// this works
obj = newObject( MyClass( 20 ) );
show(obj:getvalue);
// there should be no harm deleting
// an object once I am finished with it
obj<<DELETE></DELETE>
Betreff: Löschen von Objekten in v15Vielen Dank an alle, ich denke, die Beweise sind klar, dass die Neuzuweisung einer Objektvariablen das Objekt zerstört, anstatt es als Waise im Speicher zu belassen.
Betreff: Löschen von Objekten in v15Es scheint, als würde es überschrieben, wenn Sie nur die Variable überschreiben.Ich rannte
Names Default To Here( 1 );
Define Class(
"Test",
nObs = 20;
addition = Method( {x, y},
(x + y) * nObs
);
append = Method( {a, b},
Char( a ) || " + " || Char( b )
);
);
for(i=1, i<=1000000, i++,
clref = New Object( Test() );
);
delete symbols(clref);
Beim Betrachten der Speichernutzung von JMP bewegte es sich nicht wirklich.Ich würde erwarten, wenn es nicht tatsächlich überschrieben würde, dass der Speicher steigen würde, wenn ich eine Million davon habe.
Betreff: Löschen von Objekten in v15Ich verstehe auch nicht, wie man es benutzt. Ich denke du brauchst es nicht:
Define Class(
"aa",
{_init_ = Method( {a}, this:b = a ), //
x=1, //
m1 = Method( {a, b}, a * b )}
);
//
lcaa42 = New Object( aa(42) );
lcaa42:x= Run Program(//
Executable( "PING.EXE" ), //
Options( {"-n 50", "localhost"} ), //
ReadFunction(
Function( {this},
write(this << read);
)
)
);
wait(5); // report about 5 of the 50 pings to the log
// this will destroy the old object and replace it with a
// new one. The log will report the RunProgram object was
// destroyed; there may be a more clever way to witness the
// destruction...best I could come up with...
lcaa42 = New Object( aa(42.1) ); // the old one is gone
lcaa43 = New Object( aa(43) ); // the class still works
show(lcaa42:b,lcaa43:b); // 42.1,43
Show Classes();Ping von v1-PC [::1] mit 32 Byte Daten:
Antwort von ::1: time<1ms
Antwort von ::1: time<1ms
Antwort von ::1: time<1ms
Antwort von ::1: time<1ms
Antwort von ::1: time<1ms
Antwort von ::1: time<1ms
Das externe Programm erzeugte eine Ausgabe, als das RunProgram-Objekt zerstört wurde.
Verwenden Sie eine JSL-Variable zum Speichern des RunProgram-Objekts.
Senden Sie optional Nachrichten an die Variable, um die Lebensdauer des Objekts zu verwalten.
lcaa42:b = 42,1;
lcaa43:b = 43;
// Klasse aa
_init_ = Methode( {a}, this:b = a );
m1 = Methode( {a, b}, a * b );
x = 1;
Dies zeigt, dass das erste Objekt gelöscht wurde, indem der Variablen, die es enthält, ein neuer Wert zugewiesen wurde.
Wenn andere Variablen kopiert (nicht geklont) werden
lcaa42b=lcaa42;
dann müssen alle Kopien gelöscht werden, um das Objekt zu zerstören.
lcaa42b=0;
lcaa42=0;
@EvanMcCorkle
Betreff: Löschen von Objekten in v15Ich weiß nicht.
Bevor es möglich war, Klassen zu "definieren", habe ich sie mit Namespaces erstellt.
Bei Namensräumen funktioniert dies nicht, dh das Setzen der Variable auf fehlend ist nicht dasselbe wie das Löschen des Namensraums.
ns = newNamespace("xyz");
ns:a = 10;
ns = .;
show namespaces();Betreff: Löschen von Objekten in v15Funktioniert das: obj = .;