2011-10-05 7 views
10

मेरे Google मानचित्र v3 ऐप में, मैं मार्कर बनाना और उन्हें मानचित्र पर डाल रहा हूं। प्रत्येक के लिए, मैं 'क्लिक' पर एक ईवेंट श्रोता जोड़ रहा हूं, इसलिए जब कोई उपयोगकर्ता उन पर क्लिक करता है तो मैं एक जानकारी विंडो दिखा सकता हूं।Google मानचित्र v3 में, स्मृति से मार्कर को स्वचालित रूप से किसी भी श्रोताओं को मार देता है?

मैं अपने मार्कर को जावास्क्रिप्ट सरणी में रख रहा हूं और मानचित्र पर उन्हें दिखाने/छुपाने के लिए .setMap() का उपयोग कर रहा हूं। ऐसे कुछ मामले हैं जहां उपयोगकर्ता चाहते हैं कि वे मानचित्र से हटा दें। इस मामले में मैं marker.setMap (शून्य) करता हूं और फिर मेरी सरणी से मार्कर को हटा देता हूं।

क्या यह मार्कर पर ईवेंट श्रोताओं की एक सरणी रखने की भी सिफारिश की जाती है ताकि जब मैं मार्कर को हटा दूं तो मैं उन्हें हटा सकता हूं? या घटना श्रोता स्मृति से हटा दिए जाने पर स्मृति से हटा दिया जाएगा-वस्तु को स्मृति से हटा दिया जाएगा?

एक अंतिम उपयोगकर्ता दृष्टिकोण से, मुझे नहीं लगता कि यह ऐसा करने के लिए महत्वपूर्ण है, लेकिन मुझे उत्सुकता है कि अगर ईवेंट श्रोता अभी भी स्मृति में है, भले ही मैं मार्कर को हटा दूं। मैं जितना संभव हो उतना साफ होना चाहता हूं।

उत्तर

12

मुझे यकीन नहीं है कि श्रोताओं को हटा दिया गया है, लेकिन मेरा अनुमान नहीं है। मेरा अनुमान है कि श्रोता अभी भी सुन रहा है, भले ही आपके पास ऑब्जेक्ट का कोई संदर्भ न हो, श्रोता करता है, इसलिए यह स्मृति में रहेगा। इससे पहले कि आप इसे अपने सरणी से हटाने के सभी श्रोताओं स्पष्ट करने के लिए, आप

google.maps.event.clearInstanceListeners(marker); 

कॉल कर सकते हैं श्रोता के लिए एक संदर्भ रखने की जरूरत नहीं है।

1

जहाँ तक मैं कह सकता हूं, श्रोताओं को स्मृति से हटा दिया जाता है।

सैद्धांतिक रूप से, यह शायद इसलिए है क्योंकि श्रोताओं को सक्रिय रूप से इस तरह की बात नहीं सुनती है - Google मानचित्र केवल उन्हें प्रासंगिक सुविधा में संग्रहीत करता है, और उसके बाद उस सुविधा को पूछता है जब किसी ईवेंट को निकाल दिया जाता है।

व्यावहारिक रूप से, मैं एक परीक्षण भाग गया, और इन परिणामों हैं:

जे एस में
Tabs 1 and 2 create a point with 20000 listeners, and track the listeners. 
Tab 3 creates a point with 20000 listeners, but doesn't track them. 
Stage 1 is after they've got the listeners. 
Stage 2 is after they've dropped something (tab 1: point, 2: listeners, 3: point) 
Stage 3 is after they've dropped the other (tab 1: listeners, 2: point, 3: no change (listeners dropped implicitly at stage 2)) 
Tab  PID  Memory (live, K) at stage... 
       1  2  3 
1  4643 18194 16026 8265 
2  4659 18174 8155 8227 
3  4676 17750 8152 8202

मेमोरी उपयोग, मूर्खता से ट्रैक करने के लिए कठिन है आंशिक रूप से (मुझे लगता है) स्वत: कचरा कलेक्टर की वजह से। इन परिणामों को प्राप्त करने के लिए मैंने क्रोम के कार्य प्रबंधक में निर्मित किया, और प्रयोग के प्रत्येक प्रमुख चरण के बाद मेमोरी कलेक्टर के हाथ को मजबूर करने के लिए स्मृति के बड़े हिस्से में और फिर उपयोग से बाहर चले गए।

यहां एक जिज्ञासा यह है कि जब टैब 1 बिंदु को छोड़ देता है, तो यह लगभग 2000 के मेमोरी खो देता है, जबकि जब टैब 2 बिंदु छोड़ देता है, तो यह 77K (स्मृति उपयोग की अस्थिरता को देखते हुए एक नगण्य परिवर्तन) प्राप्त करता है। मुझे संदेह है कि ऐसा इसलिए है क्योंकि टैब 1 को 20000 श्रोताओं के साथ संलग्न करता है, जबकि टैब 2 एक नंगे बिंदु को छोड़ देता है।

यहां मैंने उपयोग किया स्रोत है। मैं एक बेला लिंक प्रदान नहीं कर रहा हूँ क्योंकि बेला बस ट्रैकिंग स्मृति के उपयोग और भी कठिन बना देता है:

<!DOCTYPE html> 
<html> 
     <head> 
       <style type="text/css"> 
         html, body {height: 100%; width: 100%;} 
         #map {width: 100%; height: 80%;} 
       </style> 
     </head> 
     <body> 
<h1>Welcome to MapLand, home of a single map.</h1> 
<div id="map"></div> 
<button onclick="addPts(true);">add points (store listeners)</button> 
<button onclick="addPts(false);">add points (don't store listeners)</button> 
-------- 
<button onclick="deletePts();">delete points</button> 
<button onclick="deleteLs();">delete listeners</button> 
-------- 
<button onclick="checkListenerVar();">check listener var</button> 
<button onclick="cycleLargeChunk();">cycle large chunk</button> 
     </body> 
     <script src="test2.js"></script> 
     <script async src="https://maps.googleapis.com/maps/api/js?key=AIzaSyAorBo-zMFJo9viqdv3pkuhMyg5hytpbaQ&callback=initMap"></script> 
</html> 

जे एस (test2.js):

/

एचटीएमएल (अपनी खुद की API कुंजी सम्मिलित)

var uluru = {lat: -25.363, lng: 131.044}; 
var map; 
function initMap() { 
     map = new google.maps.Map(document.getElementById('map'), { 
       zoom: 4, 
       center: uluru 
     }); 
} 
var ptLat = uluru.lat, ptLng = uluru.lng; 
var pts = []; // points 
var ls = []; // listeners 
var listenerVar; 
function addPts(storeLs) { 
     var m = new google.maps.Marker({ 
       position: {lat: ptLat, lng: ptLng}, 
       map: map 
     }); 
     ptLng += 1; 
     if (ptLng > uluru.lng + 20) { 
       ptLng = uluru.lng; 
       ptLat += 1; 
     } 
     pts.push(m); 
     for (var i = 50000; i > 0; i--) { 
       var l = google.maps.event.addListener(m, 'click', function() {listenerVar = i;}); 
       if (storeLs) ls.push(l); 
     } 
} 
function deletePts() { 
     for (var i = pts.length-1; i >= 0; i--) pts[i].setMap(null); 
     pts = []; 
     ptLat = uluru.lat; 
     ptLng = uluru.lng; 
} 
function deleteLs() { 
     for (var i = ls.length-1; i >= 0; i--) ls[i].remove(); 
     ls = []; 
} 
function checkListenerVar() { 
     alert("Listener var is " + listenerVar + ", but is being reset to -1."); 
     listenerVar = -1; 
} 
function cycleLargeChunk() { 
     var l = [0]; 
     for (var i = 0; i < 26; i++) { 
       l = l.concat(l); 
     } 
     //Force the environment to hang on to l for at least a second. 
     setTimeout(function() {console.log(l.length);}, 1000); 
} 
संबंधित मुद्दे