サイトトップ

Director Flash 書籍 業務内容 プロフィール

Macromedia Flash非公式テクニカルノート

delete

ID: FN0310005 Product: Flash

Platform: All
Version: 5.0 and above

シンタックス
delete 参照

オペランド[*1]
参照   消去する変数またはオブジェクトの識別子[*2]。

[訳者註*1] 原文では、"parameters"と表記されています。オペランド(operand)とは、演算子(operator)の対象(「被演算子」)を意味します。

[訳者註*2] 原文では、"name"と記載されています。しかし、「識別子」(identifier)とした方が正確でしょう。タイムライン変数は、原則としてパスを参照する必要があります。

戻り値
ブール(論理)値。

説明
演算子; オペランド(parameter)として参照に指定されたオブジェクトまたは変数を破棄します。オブジェクトが正しく削除できれば、trueを返します。そうでなければ、値としてfalseが返されます。この演算子は、スクリプトで使用されたメモリを解放するのに役立ちます。delete演算子を使うと、オブジェクトへの参照を削除できます。オブジェクトへの参照がすべて削除されると、Flash Playerがそのオブジェクトを消去し、オブジェクトの使用していたメモリを解放します[*3]。

deleteは演算子ですが、通常つぎの例のようにステートメントとして用いられます。

delete x;

delete演算子は、処理ができないとfalseを返します。それは、オペランドの参照が存在しないときや、削除できないものであった場合です。定義済みのオブジェクトやプロパティ、あるいはvar宣言された変数は、削除できません[*4]。また、delete演算子を使って、MovieClipを削除することはできません[*5]。

[訳者註*3] オブジェクトへの参照を管理して、すべての参照が消滅するとメモリを自動的に解放する仕組みは、「ガーベジコレクション」(garbage collection)と呼ばれます。delete演算子は、オペランドの参照を破棄するだけで、直接オブジェクトを削除してメモリを解放する訳ではありません(なお、「ガーベジコレクション」については、拙著『オブジェクト指向で考えるActionScript − Flash MXでより進んだWebデザイン作成 −』p.143およびp.158注[*9]参照)。

[訳者註*4] 関数(function)の引数は、var宣言されたローカル変数と基本的に同じ扱いになります。

function xTestDelete(a) {
  var b = "b";
  trace(delete a);  // 出力: false
  trace(a);  // 出力: a
  trace(delete b);  // 出力: false
  trace(b);  // 出力: b
}
xTestDelete("a");

ところが、Flash MX以前では、引数をdelete演算子で削除することが可能でした。つまり、delete演算子で削除した結果としてtrueが返され、変数値はundefinedになります。これはバグと理解すべきでしょう。Flash MX 2004では、上記スクリプトの動作に修正されています。ただし、Flash Player 6以前でパブリッシュすると、おそらく以前との互換性のため、関数の引数は削除できます。

[訳者註*5] 動的に配置したMovieClipインスタンスは、MovieClip.removeMovieClip()メソッドを使って削除します。オーサリング時に配置されたMovieClipインスタンスの場合は、MovieClip.unloadMovie()メソッドでコンテンツを消去することは可能です。ただし、インスタンスのパスは存続します。


使用例1: つぎのサンプルは、オブジェクトを生成して使用し、必要がなくなってから削除しています。

var account:Object = new Object();
account.name = "Jon";
account.balance = 10000;
trace(account.name);  // 出力: Jon
delete account;
trace(account.name);  // 出力: undefined[*6]

使用例2: つぎのサンプルは、オブジェクトのプロパティを削除しています。

// 新規オブジェクトaccountを生成
var account:Object = new Object();
// accountにプロパティnameを設定
account.name = 'Jon';
// プロパティを削除[*7]
delete account.name

使用例3: つぎのサンプルは、配列のエレメントを削除しています[*8]。

var my_array:Array = new Array();
my_array[0] = "abc";  // my_array.length == 1
my_array[1] = "def";  // my_array.length == 2
my_array[2] = "ghi";  // my_array.length == 3
// my_array[2]を削除しても、Array.lengthは変わらない[*9]
delete my_array[2];
trace(my_array.length);  // 出力: 3
trace(my_array);  // 出力: abc,def,undefined

使用例4: つぎのサンプルは、オブジェクト参照が削除されたときの動作を示します。

var ref1:Object = new Object();
ref1.name = "Jody";
// 変数の参照を新しい変数にコピー
// その後ref1を削除する
ref2 = ref1;
delete ref1;
trace("ref1.name "+ref1.name);  //出力: ref1.name undefined
trace("ref2.name "+ref2.name);  // 出力: ref2.name Jody[*10]

ref1をref2にコピーしていなかったら、ref1が削除されたときオブジェクトも削除されます。そのオブジェクトへの参照が、存在しなくなるからです。ref2を削除すれば、オブジェクトへの参照はひとつもなくなります。すると、オブジェクトは破棄され、使用されていたメモリが解放されます。

[訳者註*6] 原文は「// output: Jon undefined」とされており、その前のtrace()ステートメントには出力の記載がありません。誤りでしょう。

[訳者註*7] オブジェクトのプロパティを削除しただけですので、プロパティのみが消滅し、オブジェクトインスタンスは存続します。以下のtrace()ステートメント2行をスクリプトの最後に追加すると、わかりやすいでしょう。

trace(account);  // 出力: [object Object]
trace(account.name);  // 出力: undefined

[訳者註*8] 原文は、"The following example deletes an object property"と説明しています。しかし、この例は配列のエレメントを削除した場合の例として、理解した方がよいと思われます。

[訳者註*9] 配列のエレメントを削除した場合、エレメントの値が未定義値undefinedになるだけで、Array.lengthプロパティの値は変更されません(拙著『モーショングラフィックスで学ぶActionScript − Flash MX −』p.241〜「8.4 さらに検討」参照)。

[訳者註*9] 原文では、出力の記載に文字列「ref1.name」や「ref2.name」が含まれていません。誤りと考えられるため、修正しました。

Player
Flash Player 5.0以降。

関連項目
var

出典
ActionScript Language Reference(Flash MX 2004 7.2英語版)より邦訳。

_____

作成者: 野中文雄
更新日: 2004年9月20日 7.2のドキュメントに合わせて記述を修正し註釈を追加
作成日: 2003年10月13日


Copyright © 2001-2006 Fumio Nonaka.  All rights reserved.