看起来只是简单地新建一个as3声音对象,并将其引用设置为null会产生内存泄漏,无论是否已用于在其上播放SoundChannel。
例如,使用下一个文本代码:
package
{
import flash.display.*;
import flash.events.*;
import flash.media.*;
import flash.system.*;
import flash.utils.*;
import flash.system.*;
public class Main extends Sprite
{
[Embed(source = "../data/SongScene8.mp3")] protected var SongScene8:Class;
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
System.gc();
trace("Before");
trace(System.totalMemory);
trace("_________________")
var sound:Sound = new SongScene8();
System.gc();
trace("After new");
trace(System.totalMemory);
trace("_________________")
sound = null;
System.gc();
trace("After null");
trace(System.totalMemory);
}
}
}
输出结果为:
在 3461120
新的 3604480
空后 3604480
即使gc在之后运行了一千次,最后一个值仍然存在。
因此,无论是否播放声道,它都看起来像声音对象 无法从记忆中删除。
请说我错了,告诉我为什么。 提前谢谢。
答案 0 :(得分:-1)
尝试给它一点时间来呼吸,记忆可能不会立即释放。
sound = null;
System.gc();
trace('After null');
trace('Instantly: ' + System.totalMemory);
setTimeout(function():void
{
trace('2 seconds later: ' + System.totalMemory);
},
2000);
另请注意,System.gc
仅适用于AIR和Flash Player的调试版!
根据an old article from gskinner,有一个强制立即释放的技巧,两次调用LocalConnection.connect
。不确定它有多可靠,但快速测试表明它似乎有效:
sound = null;
try {
new LocalConnection().connect('foo');
new LocalConnection().connect('foo');
} catch (e:*) {}
trace('After null');
trace('Instantly: ' + System.totalMemory);