Умом понять не могу, но может кто сталкивался.
Есть вот такой простенький класс (на самом деле, он там немного сложнее, но сути это не меняет), который обеспечивает проигрывание музыки и звуков в игре:

Код AS3:
package utils
{
import flash.media.Sound;
import flash.media.SoundChannel;
public class GameSound
{
private var _sound : Sound;
private var _soundChannel : SoundChannel;
private var _isMusic : Boolean;
public function GameSound( params : Object )
{
var soundClass : Class = params.soundClass as Class;
_sound = new soundClass();
_isMusic = Boolean( params.isMusic );
_soundChannel = _sound.play( 0, _isMusic ? int.MAX_VALUE : 0 );
}
public function play() : void
{
_soundChannel = _sound.play( 0, _isMusic ? int.MAX_VALUE : 0 );
}
public function stop() : void
{
_soundChannel.stop();
}
}
}
Сначала все идет нормально, вызываю play/stop многократно, но в какой-то момент (минут через 5 после начала игры) срабатывает Garbage Collector и прибивает _soundChannel. Сам экземпляр объекта GameSound остается, звук _sound тоже есть.
При этом доходит до смешного. Если вызов play() приходит на момент работы Garbage Collector'а, то ситуация будет такая:

Код AS3:
public function play() : void
{
_soundChannel = _sound.play( 0, _isMusic ? int.MAX_VALUE : 0 );
trace( _soundChannel ); // выведет null
}
Хотя очевидно, что _soundChannel является локальной переменной существующего объекта, т.е., ссылка на него есть, а значит Garbage Collector его трогать не должен.
Сначала я выявил это в AIR SDK 22, но потом скомпилировал Flex SDK 4.6 - та же ситуация.