2011-09-07 64 views
1

我以前从未使用过actionscript,但为了使地图正常工作,我只好深入其中。Actionscript + Google Maps API内存泄漏

我用下面的代码添加地图标记,更换如果存在前一个:

public var tracer:Array = new Array(); 
public var tracerLng:Number = 0; 

for (var i : Number=1 ; i<64000 ; i++) 
{ 
    //Check if there is already a marker, if so get rid of it 
    if(tracerLng > 0) { 
     map.removeOverlay(tracer[0]); 
     tracer[0] = null; 
     tracer.pop(); 
    } 
    // Set up a marker 
    var trackMrk:Marker = new Marker(
     new LatLng(_lat, _lng), 
     new MarkerOptions({ 
      strokeStyle: new StrokeStyle({color: 0x987654}), 
      fillStyle: new FillStyle({color: 0x223344, alpha: 0.8}), 
      radius: 12, 
      hasShadow: true 
     }) 
    ); 
    //Add the marker to the array and show it on the map 
    tracerLng = tracer.push(trackMrk); 
    map.addOverlay(tracer[0]); 
} 

我的第一个问题是,运行此代码(64000次重复的测试,最终应用程序将不需要运行很多次)。无论哪种方式,内存使用量增加约4kB/s - 我如何避免这种情况发生?

其次 - 有谁能告诉我如何让这个程序更优雅吗?

预先感谢咨询

回答

0

这不是内存泄漏,它可能产生事件的结果 - 输入框,鼠标事件,自定义事件等,只要你的记忆不会继续上涨,并永远不会有任何问题 - 它会在适当的时候收集垃圾。

您的代码几点:

  • tracer阵似乎并没有做任何事情 - 你只似乎是拿着有一两件事的时间,所以数组是没有意义的。如果你需要一个数组,使用Vector来代替。它更小,更快。更确切地说,如果你创建一个具有特定长度的。
  • 除非需要创建新的Marker,否则不要创建新的Marker。重用旧对象。了解对象池:http://help.adobe.com/en_US/as3/mobile/WS948100b6829bd5a6-19cd3c2412513c24bce-8000.htmlhttp://lostinactionscript.com/2008/10/30/object-pooling-in-as3/
  • LatLngMarkerOptions(包括笔触和填充对象)似乎并没有改变(我假设LatLng对象允许您设置一个新的位置)。如果是这样的话,不要在不需要的时候创建新的。如果您需要创建新的邮件,StrokeStyleFillStyle似乎很适合“创建一次,使用无处不在”策略。
  • Marker类中创建一个destroy()函数或类似函数,并在需要删除一个函数(在将其设置为null或从数组中弹出之前)中明确调用它。在destroy()函数中,将任何参数都归为非基类(int,Number,String等)。垃圾收集使用引用计数方法和标记和扫描方法运行。理想情况下,您希望使用引用计数来运行所有内容,因为它可以更快地收集并停止程序中的任何停顿。

我在AS3解释内存管理多一点的位置:http://divillysausages.com/blog/tracking_memory_leaks_in_as3

还包括一个类,它可以帮助您跟踪内存泄漏,如果有任何