Rich-UI-Speicherverwaltung

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:

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”.