Synthesizer V Studio のスクリプトシステムは、参照カウントを使用し、
- オブジェクトの共有
- ホスト(ハードコードされたメモリ管理でネイティブコードを実行する)とクライアント(ガベージコレクションを使用する)の間の所有権を安全な移転
を実現します。
ほとんどの場合、基本的なメカニズムを意識しなくとも、スクリプト作者はメモリ安全で問題なく動作するコードを書くことができます。ほとんどの誤用はスクリプト環境によって検出され、「削除されたオブジェクトへのアクセスに失敗しました」などのエラーメッセージがポップアップするからです。しかし、検出されず、非常にまれにクラッシュの原因となるエッジケースはありえます。
マネージドオブジェクトとアンマネージドオブジェクト
NestedObject
は、親を持たない場合、クライアント環境によってガベージコレクトされる可能性があります(マネージド)。ただしトップレベルオブジェクト(ホスト所有、例えばメインプロジェクト)である場合、その限りではありません。NestedObject
が親を持つ場合、それは常に アンマネージド です。
例えば、スクリプトを使用して NoteGroup
が作成され、そこにいくつかのノートが追加されている場合、
- ノートグループ (マネージド)
- ノート 1 (アンマネージド)
- ノート 2 (アンマネージド)
- ノート 3 (アンマネージド)
- オートメーション 1 (アンマネージド)
- オートメーション 2 (アンマネージド)
- ...
親 NoteGroup
がクライアントによってガベージコレクトされると、NoteGroup
のホスト側デストラクタが起動され、アンマネージドなすべての子 NoteGroup をクリーンアップします。
クライアント環境で NoteGroup
のアンマネージドなノートへの参照がある場合、アンマネージドなノートが削除されると(つまり、親 NoteGroup
がガベージコレクションされたとき、あるいはユーザが明示的にノートを削除したときのどちらか)、その参照は削除されたものとしてマークされます。無効な参照へのアクセスは検出され、「削除された
'Note' オブジェクトへのアクセスに失敗しました」というエラーメッセージが表示されます。
マネージドな NoteGroup
を
Project
に追加すると、アンマネージドなオブジェクトに変換されます。この変換は、ガベージコレクションのバイパスを知らせる単純な状態変化であり、メモリの割り当て/開放/コピーを伴いません。