Zwei Speicherverwaltungsfunktionen sind zur Vermeidung von Speicherlecks verfügbar. Solche Lecks verlangsamen Ihre Anwendung und können zu einem Absturz des Browsers führen.
Dieses Problem tritt hauptsächlich auf, wenn Sie ein Widget oder einen eingebetteten Handler innerhalb
einer Funktion deklarieren. Diese funktionsinternen Deklarationen reservieren Speicher während der Laufzeit. Auch nach
Beendigung der Funktionen gibt der Browser den Speicher erst an das Betriebssystem zurück,
wenn der Benutzer die Browserregisterkarte geschlossen hat.
Jede der Speicherverwaltungsfunktionen fordert vom Browser die Rückgabe von Speicher an. Der Browser erfüllt die Anforderung normalerweise mit Verzögerung, jedoch noch während die Anwendung ausgeführt wird.
Es handelt sich um folgende Funktionen:
- UtilLib.destroyRUIHandler (ruiHandler Any in) fordert das Entfernen der Widgets in dem angegebenen Handler an, in allen in den angegebenen Handler eingebetteten Handlern sowie in allen Handlern, die in den eingebetteten Handlern eingebettet sind, unabhängig von der Verschachtelungstiefe. Der Eingabewert muss ein Rich-UI-Handler sein.
- UtilLib.destroyWidget (myWidget Widget in) fordert die Entfernung des angegebenen Widgets an.
- UtilLib.destroyWidgetChildren (myWidget Widget in) fordert die Entfernung der untergeordneten Elemente des angegebenen Widgets an.
Keine dieser Funktionen gibt einen Wert zurück.
Wenn das oben beschriebene Problem bei Ihnen auftritt, beachten Sie die folgenden Codierungskonventionen:
- Verwenden Sie die Speicherverwaltungsfunktionen, um reservierten Speicher zurückzugeben, der nicht mehr benötigt wird.
- Verwenden Sie in einer Funktion anonyme Deklarationen nur, wenn Sie Zugriff auf den benannten
Container haben, wobei es sich um das benannte Widget handelt, in das die anonymen Deklarationen
eingebettet sind.
Betrachten Sie zum Beispiel eine QuickInfo (Tooltip). Dies ist ein Feld (kleines Fenster), das angezeigt wird, wenn der
Benutzer den Mauszeiger über einen Bereich auf der Seite bewegt. Ein
QuickInfo-Provider ist eine
Funktion, die das Feld, das angezeigt werden soll, zurückgibt. Der Code für diese Funktion könnte
wie folgt aussehen:
Function myProvider (widget any in) returns(Box)
return (new Box {children = [new Button{text = "Memory leak"}]});
end
In diesem Beispiel erstellt der QuickInfo-Provider ein Feld, auf das nicht von
außerhalb der Funktion verwiesen werden kann. Das Feld selbst enthält ein anonymes Widget. Da nicht auf das
Feld verwiesen werden kann, bedeutet dies, dass Sie das Feld oder das anonyme untergeordnete Element
nicht an eine Speicherverwaltungsfunktion übergeben können.
Um das Problem in diesem Beispiel zu
umgehen, deklarieren Sie das Feld außerhalb des QuickInfo-Providers:
myBox Box{};
Function myProvider (widget any in) returns(Box)
myBox.children = [ new Button{text = "Problem solved"} ];
return(myBox);
end
An einer anderen Stelle in Ihrer Anwendung können Sie nun
myBox an
eine Speicherverwaltungsfunktion übergeben, wie im folgenden Beispiel dargestellt:
UtilLib.destroyWidgetChildren(myBox);
- Nachdem Sie die Funktion removeChild oder
removeChildren zum Entfernen der Widgets aus einer DOM-Baumstruktur verwendet
haben, entfernen Sie den Speicher, der für diese Widgets reserviert war. Details zu diesen Funktionen finden
Sie unter “Widgeteigenschaften und Widgetfunktionen”.