2011-02-25 16 views
5

मान लीजिए मैं एक वर्ग Aमेरी जेटपैक आधारित पुस्तकालय में (यानी हम क्रोम/एक्सटेंशन कोड के बारे में बात कर रहे हैं) लिख रहा हूँ:कमजोर संदर्भ

function A() { 
    //constructor 
} 
A.prototype = { 
    //class members 
}; 

उपयोगकर्ता द्वारा बनाया जाने वाला वर्ग A का उदाहरण:

var a = new A(); 

अब लगता है मुझे A के सभी उदाहरणों बनाए गए का ट्रैक रखने के लिए चाहते हैं, मैं कर सकता:

+०१२३५१६४१०
var listA = []; 

और A के निर्माता में listA.push(this); जोड़ने के लिए, के साथ समाप्त:

var listA = []; 

function A() { 
    // constructor 
    listA.push(this); 
} 

A.prototype = { 
    // class members 
}; 

सब ठीक है जब तक a के उपयोगकर्ता अपने संदर्भ चला जाता है (उदाहरण के लिए a गुंजाइश से बाहर चला जाता है)। अब मुझे एक समस्या है: listA में अभी भी a का संदर्भ है, इसलिए यह कभी भी कचरा एकत्र नहीं किया जाएगा। इसके अलावा मेरे पास listAA के उदाहरणों को फ़िल्टर करने का कोई तरीका नहीं है जो अन्यथा पहुंच योग्य नहीं हैं। मैं प्रभावी रूप से स्मृति लीक कर रहा हूँ।

मुझे जो चाहिए वह नियमित रूप से listA कमजोर संदर्भों को धक्का देना है। मुझे लगता है कि इसे किसी भी तरह से करना संभव है, लेकिन मुझे नहीं पता कि यहां से कहां जाना है। मैं की तरह कुछ कल्पना कर सकते हैं:

var weak_a = new weakRef(a); 
assert(weak_a.ref === a); 

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

+0

तो ... listA एक सदस्य है? –

+0

नहीं। मैंने सवाल संपादित किया, उम्मीद है कि अब यह स्पष्ट है। – CAFxX

उत्तर

3

आपको बस अपनी कक्षा indicate it supports weak references बनाने की आवश्यकता है। फिर, जब आप इसके कमजोर संदर्भ संस्करण का उपयोग करना चाहते हैं, तो आप Components.utils.getWeakReference का उपयोग करना चाहेंगे और उसे स्टोर करेंगे। Here is some test code जो आपको जावास्क्रिप्ट में और अधिक उपयोग करने के तरीके दिखाता है।

+0

धन्यवाद! यही वही है जो मैं खोज रहा था। क्या आपको प्रश्न के सरणी बहीखाता भाग को कैसे करना है, इस बारे में कुछ सलाह भी है (यानी जब वे जीसी द्वारा पुनः प्राप्त किए जाते हैं तो सरणी से आइटम को कुशलतापूर्वक हटाते हैं)? क्या कोई कॉलबैक मैं शोषण कर सकता हूं जिसे निष्पादित किया जाता है जब एक कमजोर संदर्भ अमान्य हो जाता है? – CAFxX

+0

कोई कॉलबैक जिसे मैं जानता हूं। आपको इसे 'Array.filter' के साथ हर बार फिर से पुन: सक्रिय करना होगा और शून्य प्रविष्टियों को हटा देना होगा। एक हैश टेबल का उपयोग करने के लिए भी तेज़ हो सकता है। – sdwilsh

+0

क्या होगा यदि nsXPCOMCycleCollectionParticipant स्क्रिप्ट योग्य था? मैं ओवरलोड कर सकता हूं :: अनलिंक() और इसे किसी अन्य प्रकार के स्वचालित विनाशक के रूप में उपयोग करें ... – CAFxX