Ereignishandler und Garbage Collection
Ereignishandler spielen eine entscheidende Rolle dabei, Anwendungen in die Lage zu versetzen, auf verschiedene Ereignisse zu reagieren. Ein häufiges Missverständnis besteht jedoch darin, dass Ereignishandler verhindern, dass Objekte in den Garbage Collection-Speicher aufgenommen werden.
Garbage Collection und Event-Handler
Im bereitgestellten Code-Snippet:
<code>MyClass pClass = new MyClass(); pClass.MyEvent += MyFunction; pClass = null;</code>
Der Ereignisabonnent MyEvent ist der MyFunction-Methode zugewiesen. Wenn pClass der Wert Null zugewiesen wird, stellt sich die Frage, ob pClass sofort in den Garbage Collection-Prozess aufgenommen wird oder ob es noch vorhanden ist und das Ereignis auslöst.
Antwort: Ereignisabonnenten haben keinen Einfluss auf die Garbage Collection des Herausgebers
Auf die konkrete Frage, ob pClass in die Garbage Collection aufgenommen wird, lautet die Antwort „Ja“. Ereignisabonnements verhindern nicht die Garbage Collection veröffentlichter Objekte (pClass).
Es ist jedoch wichtig zu beachten, dass die Garbage Collection des Zielobjekts (des Objekts, das das Ereignis verarbeitet) davon abhängt, ob die MyFunction-Methode statisch oder instanzbasiert ist.
Statischer Ereignishandler
Wenn MyFunction statisch ist, enthält es keinen Verweis auf die Instanz. Daher verhindert das Abonnieren eines Ereignisses mithilfe einer statischen Methode nicht, dass das Zielobjekt durch Garbage Collection erfasst wird.
Instanzbasierte Event-Handler
Wenn MyFunction eine Instanzmethode ist, enthält der Delegat einen Verweis auf die Instanz. Dies bedeutet, dass das Abonnieren von Ereignissen mithilfe instanzbasierter Methoden verhindert, dass das Zielobjekt durch Garbage Collection erfasst wird. Sobald jedoch das veröffentlichte Objekt (in diesem Fall pClass) für die Sammlung geeignet ist, besteht dieses Problem nicht mehr.
Hinweis: Die Beziehung zwischen Ereignisabonnenten und Garbage Collection ist einseitig. Wenn pClass Ereignisse abonniert, die von instanzbasierten Methoden verarbeitet werden, hält pClass das Zielobjekt am Leben. Allerdings hält pClass das Zielobjekt nicht am Leben, wenn es von pClass veröffentlichte Ereignisse abonniert.
Abmelden für die Müllabfuhr langlebiger Objekte
Wenn die pClass langlebig ist und ihr Speicher länger als die Instanz mit MyFunction verbleibt, kann dies verhindern, dass die Zielinstanz durch Garbage Collection erfasst wird. In diesem Fall müssen Sie sich nach der Verarbeitung vom Ereignis abmelden, damit das Zielobjekt erfasst werden kann.
Der Ereignishandler verhindert also nicht die Speicherbereinigung des veröffentlichten Objekts. Sie müssen jedoch den Typ des Ereignishandlers (statisch oder instanzbasiert) berücksichtigen und prüfen, ob das Abonnementobjekt langlebig ist.
Das obige ist der detaillierte Inhalt vonVerhindern Ereignishandler die Garbage Collection von Veröffentlichungsobjekten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!