Дело в том, что слабые ссылки стоят дорого ... они медленнее и занимают больше места ... вот код теста:
package {
//{ region imports
import flash.display.Sprite;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.system.System;
import flash.utils.*;
//} endregion
public class Main extends Sprite {
public function Main():void {
switch (0) {
case 0: this.benchmarkDispatchers(false); break;
case 1: this.benchmarkDispatchers(true); break;
case 2: this.benchmarkDictionaries(false); break;
case 3: this.benchmarkDictionaries(true); break;
}
}
private function benchmarkDictionaries(weakKeys:Boolean, size:uint = 1000000):void {
var a:Array = [];
for (var i:int = 0; i < size; i++)
a.push( { "foo":i } );
var d:Dictionary = new Dictionary(weakKeys);
var start:int = getTimer();
var mem0:int = System.totalMemory;
for (var j:int = 0; j < size; j++)
d[a[j]] = j;
trace("adding "+size+" keys took "+(getTimer()-start)+" msecs and "+(System.totalMemory-mem0)+" B of memory with weakKeys == "+weakKeys);
}
private function benchmarkDispatchers(weakRef:Boolean, size:uint = 100000):void {
var a:Array = [];
var f:Function = function (i:*):Function {
return function ():void { i; }
}
for (var i:int = 0; i < size; i++)
a.push( f(i) );
var e:EventDispatcher = new EventDispatcher();
var start:int = getTimer();
var mem0:uint = System.totalMemory;
for (var j:int = 0; j < size; j++)
e.addEventListener("foo", a[j], false, 0, weakRef);
trace("adding " + size + " event handlers took " + (getTimer() - start) + " msecs and " + (System.totalMemory - mem0) + " B of memory with weakKeys == " + weakRef);
}
}
}
это то, что я получаю на своей машине:
adding 100000 event handlers took 679 msecs and 6922240 B of memory with weakKeys == false
adding 100000 event handlers took 1348 msecs and 13606912 B of memory with weakKeys == true
adding 1000000 keys took 283 msecs and 16781312 B of memory with weakKeys == false
adding 1000000 keys took 906 msecs and 42164224 B of memory with weakKeys == true
результаты являются немного более радикальными для словарей, скорее всего потому, что в них нет вызовов ActionScript, связанных со временем, и поскольку некоторые накладные расходы на хранение при регистрации обработчика событий уменьшают разницу между необходимой памятью (как вы можете видеть, это 69 байт обработчик и 16 байт / ключ при сравнении слабых ссылок) ...
так что да, речь идет о производительности ... использование слабых ссылок не о крутом факте, что вам не нужно удалять слушателя, чтобы объект умер, если вы хотите иметь масштабируемую приложение, вам нужно делать такие вещи самостоятельно, и если вы хотите, чтобы это было на 100% надежно, вы не можете надеяться, что GC выполнит вашу работу, но вам нужно сделать уборку самостоятельно ... а также, если у вас хорошая иерархия в вашем приложении, вы, вероятно, не будете часто сталкиваться с этой проблемой ... в некотором смысле, это роскошь, если вы не хотите тратить время на правильную очистку объектов потому что проблемы, которые не могут быть решены без слабых ссылок, редки ... их следует использовать, когда они дают реальное преимущество, а не просто из-за лени ... я думаю, поэтому по умолчанию это ложно ...
надеюсь, что это помогает ...;)
Greetz
back2dos