2011-09-07 62 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

還包括一個類,它可以幫助您跟蹤內存泄漏,如果有任何