Release Self?
Übersicht

![]() |
RatchetBetreff: Release Self? |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallöchen,
Ich habe mehrere Typen bei denen ich eine eigene New Methode implementiert habe. Dort wird die neu erzeugte Instanz automatisch zu einer Liste hinzugefügt. Nun würde ich gerne eine Destroy Methode erstellen bei der die Instanz aus der Liste entfernt und komplett gelöscht wird. Also dachte ich mir ich mache BlitzMax: [AUSKLAPPEN] Method Destroy() Allerdings meckert BM beim Release rum: "Expression must be a variable" Gibt es da eine Möglichkeit? Oder wie macht ihr sowas? |
||
[iMac 27"] [3,4GHz Intel Core i5 ] [8GB Ram] [NVIDIA GeForce GTX 775M 2GB] [MacOS X Yosemite] [BlitzMax + MaxGui] [Monkey X Pro] |
![]() |
Firstdeathmaker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Release ist nur zum löschen eines Integer-Handles gedacht, nicht zu löschen einer Instanz als solches. Beispiel:
Code: [AUSKLAPPEN] SuperStrict
Local a:TMyTestbed = New TMyTestbed Local b:Int = HandleFromObject(a) Local c:TMyTestbed = TMyTestbed(HandleToObject(b)) Print "Object a: "+(a<>Null) Print "Object c: "+(c<>Null) Print "b:"+b Release b c:TMyTestbed = TMyTestbed(HandleToObject(b)) Print "Object a: "+(a<>Null) Print "Object c: "+(c<>Null) Print "b:"+b a = Null c:TMyTestbed = TMyTestbed(HandleToObject(b)) Print "Object a: "+(a<>Null) Print "Object c: "+(c<>Null) Print "b:"+b GCCollect() End Type TMyTestbed Field name:String = "hallo" Method Delete() Print "Testbed deleted" End Method End Type Wenn du ein Objekt wirklich löschen möchtest, muss du alle Verbindungen (Links) auf dieses löschen, sprich alle Variablen in denen es gespeichert wird auf "Null" setzen (auch in Listen, Arrays und TMaps). Erst dann holt sich der GC die Reste. Ob du wirklich alle Verbindungen gelöscht hast, kannst du mit der "Delete()" Methode überprüfen: Sie wird erst aufgerufen, wenn du alle Verbindungen gelöscht hast und der Garbage Collector aktiviert wurde. Daher ist sie auch nicht dazu geeignet die Verbindungen zu löschen; das muss man in einer eigenen Methode machen. Das Einzige was du bei deinem Code machen musst ist die Zeile mit Release wegzunehmen. Solange du den Link aus der Liste entfernst existieren dann ja keine weiteren Verweise mehr auf das Objekt und es wird automatisch gelöscht. Es ist allerdings eleganter und effizienter, wenn du beim hinzufügen zu der Liste den zurückgegebenen Link im Objekt speicherst und dann über removelink() löscht. Beispiel: Code: [AUSKLAPPEN] 'vorher GCCollect() Print GCMemAlloced() Main() 'Zeugs machen 'nachher Rem Normalerweise würde ich das nicht schreiben: Der GC läuft automatisch. Allerdings möchte ich, dass er genau jetzt nachschaut ob es was zu bereinigen gibt, da ich nachher ja GCMemAlloced() aufrufe. End Rem GCCollect() Print GCMemAlloced() Function Main() 'Sachen erstellen TName.Create("FDM") TName.Create("Decrayer") 'Sachen wieder löschen Local n:TName n = TName.get("FDM") n.remove() n = TName.get("Decrayer") n.remove() n = Null 'Wichtig an dieser Stelle, da sonst n immer noch auf den TName mit name="Decrayer" zeigen würde und es somit nicht gelöscht würde. End Function Type TName 'Global Global list:TList = New TList Function Create:TName(name:String) Local n:TName = New TName n.setName(name) Return n End Function Function Get:TName(name:String) For Local n:TName = EachIn list If n.getName() = name Return n Next End Function 'Local Field _name:String Field _link:TLink Method New() _link = TName.list.addlast(Self) End Method Method setName(name:String) Self._name = name End Method Method getName:String() Return Self._name End Method Method remove() RemoveLink(_link) End Method End Type |
||
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon Gewinner des BCC #57 User posted image |
![]() |
Ratchet |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dass ich zum Löschen alle Rezerenzen auf Null setzen muss war mir zwar schon klar. War mir aber nicht sicher ob ein Löschen aus der Liste reicht. Aber wo du es sagtst wird mir klar, dass es ja auch nur eine Referenz ist.
Dann werde ich auf jeden Fall auch noch RemoveLink verwenden. Dankeschön ![]() |
||
[iMac 27"] [3,4GHz Intel Core i5 ] [8GB Ram] [NVIDIA GeForce GTX 775M 2GB] [MacOS X Yosemite] [BlitzMax + MaxGui] [Monkey X Pro] |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group