Rich UI メモリー管理
メモリー・リークを防ぐために、2 つのメモリー管理関数を使用できます。 メモリー・リークはアプリケーションの速度を低下させ、ブラウザーの異常終了の原因となることもあります。
この問題は主に、ウィジェットまたは組み込みハンドラーを関数内で宣言した場合に発生します。 これらの関数内宣言は、メモリーを実行時に割り振ります。関数が終了した後も、ユーザーがブラウザーのタブを閉じるまで、ブラウザーはメモリーをオペレーティング・システムに返しません。
それぞれのメモリー管理関数は、ブラウザーにメモリーの制御を返すことを要求します。ブラウザーは一般に、遅延後で、かつアプリケーションがまだ実行している間に、この要求を実行します。
関数は以下のとおりです。
- UtilLib.destroyRUIHandler (ruiHandler Any in) は、指定されたハンドラー内のウィジェット、指定されたハンドラーに埋め込まれたすべてのハンドラー内のウィジェット、および埋め込まれたハンドラー内に埋め込まれたすべてのハンドラー内のウィジェットを、任意の深さレベルまで除去することを要求します。入力値は Rich UI ハンドラーである必要があります。
- UtilLib.destroyWidget (myWidget Widget in) は、指定されたウィジェットの除去を要求します。
- UtilLib.destroyWidgetChildren (myWidget Widget in) は、指定されたウィジェットの子の除去を要求します。
これらの関数は、いずれも値を返しません。
上述の問題により影響を受ける場合は、以下のコーディング規則について考慮してください。
- メモリー管理関数は、不要になった割り振り済みメモリーを返すために使用します。
- 関数では、名前付きコンテナー (anonymous 宣言を組み込む名前付きウィジェット) にアクセスする場合にのみ anonymous 宣言を使用します。
例えば、ユーザーがページ上のある領域を移動する際に表示されるボックスである、ツールチップを考慮してみましょう。 ツールチップ・プロバイダー は、表示されるボックスを返す機能であり、この機能のコードは以下のようになります。
Function myProvider (widget any in) returns(Box) return (new Box {children = [new Button{text = "Memory leak"}]}); endこの例では、ツールチップ・プロバイダーは、その機能の外部からは参照できないボックスを作成し、ボックスそのものには無名ウィジェットが組み込まれます。 ボックスを参照できないということは、ボックスまたはその無名の子をメモリー管理機能に渡すことができないことを意味します。
この例での問題を避けるために、ツールチップ・プロバイダーの外部で以下のようにボックスを宣言します。myBox Box{}; Function myProvider (widget any in) returns(Box) myBox.children = [ new Button{text = "Problem solved"} ]; return(myBox); endアプリケーションの他の場所で、myBox をメモリー管理機能に渡すことができるようになりました。これについては以下の例で示しています。UtilLib.destroyWidgetChildren(myBox); - removeChild または removeChildren 関数を使用してウィジェットを DOM ツリーから除去した後に、それらのウィジェットに対して割り振られたメモリーを除去します。 それらの関数について詳しくは、『ウィジェットのプロパティーと関数』を参照してください。