teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

オブジェクトURLの開放についての解説図を追加

2017/10/09 13:55

投稿

defghi1977
defghi1977

スコア4756

answer CHANGED
@@ -19,4 +19,15 @@
19
19
  ```
20
20
  なお, 今回のサンプルのように何度もFileオブジェクトを読み込む場合, 不必要となったURL文字列をURL.revokeObjectURLメソッドを使って**明示的に破棄する必要があります**. さもないとURIスキーム形式に変換したFileオブジェクトがメモリから開放されず, メモリリークの原因となるからです.
21
21
 
22
- 参考:[https://developer.mozilla.org/ja/docs/Web/API/URL/createObjectURL](https://developer.mozilla.org/ja/docs/Web/API/URL/createObjectURL)
22
+ 参考:[https://developer.mozilla.org/ja/docs/Web/API/URL/createObjectURL](https://developer.mozilla.org/ja/docs/Web/API/URL/createObjectURL)
23
+
24
+ ---
25
+ 追記:解説図を添付します
26
+ ※canvasのtoBlobをinput[type=file]からFileを入手したと読み替えて下さい
27
+ ※BlobとFileは同じものと考えて下さい(FileオブジェクトはBlobオブジェクトを継承しています)
28
+ ※この図ではa要素のhref属性にオブジェクトURLを設定しファイルをダウンロードしようとしています
29
+
30
+ ![BlobURIスキーム文字列の取得と開放](806c617a9fa2d2f2f96651879cedb23c.png)
31
+ このようにWEBページはBlobURIスキーム形式のオブジェクトURLのエントリリストを内包していて, このリストがBlob(File)オブジェクトを開放しない限りメモリに残ってしまうのです.
32
+ 従って, 何も対処していないとWEBページの生存期間に比例してエントリリストが肥大していき, (滅多にありませんが)タブやブラウザのクラッシュに繋がります.
33
+ WEBページを頻繁にリロードしている場合はこの現象は発生せず見落としがちであることから, 「URL.createObjectURLとURL.revokeObjectURLとはセットで使う」ように心がけます.