बनाता है मेरे पास एक ऐसा फ़ंक्शन है जो पैरामीटर के रूप में एक और कार्य करता है। कुछ इस तरह:एएस 3 पैरामीटर के रूप में फ़ंक्शन को पास करने से स्मृति लीक
public function onHits(target : Shape, callback : Function) : void
मैं एक पैरामीटर है कि जब भी पारित कर दिया लक्ष्य कुछ हिट बुलाया जाना चाहिए के रूप में एक सदस्य समारोह पारित करके इसका इस्तेमाल। फ़ंक्शन को कई बार फ्रेम कहा जाता है। तो यह क्या कर रही द्वारा किया जाता है:
//code...
CollisionManager.onHits(myShape, onHitCB);
//code...
हिट समारोह पर:
public function onHitCB(hitObject : *) : void
{
//removed all code to test this problem
}
जब मैं ऐसा करते हैं, मैं एक स्मृति रिसाव है। मैंने उस समस्या को अलग कर दिया है जिस पर हिट्स विधि है और मैंने बाकी सब कुछ टिप्पणी की है। ऑन हिट्स एक खाली विधि है जिसमें इसके अंदर कोई कोड नहीं है, एचआईटीसीबी भी खाली है। अगर मैं ऑनसाइट पर कॉल पर टिप्पणी करता हूं, तो कोई मेमोरी रिसाव नहीं है और अगर मैं एचआईटीसीबी की बजाय शून्य पास करता हूं तो कोई स्मृति रिसाव नहीं है।
तो यह स्पष्ट रूप से है जब मैं एचआईटीसीबी को उस पैरामीटर के रूप में पास करता हूं जो समस्या है। तो मैंने सोचा कि ऐसा इसलिए हो सकता है क्योंकि फ़्लैश फ़ंक्शन पॉइंटर बनाने के लिए कुछ मेमोरी आवंटित करता है और इसे रिलीज़ नहीं करता है लेकिन मैं सिस्टम.gc() को प्रत्येक फ्रेम को डीबग मोड में कॉल करता हूं और रिसाव अभी भी वहां है। इसका मतलब यह होगा कि यह एसडीके में एक बग है या मैं कुछ सही नहीं कर रहा हूं।
मैं एक चर कि समारोह जो मैं अपने वस्तु के निर्माता में आवंटित करने के लिए अंक रख कर एक अजीब वैकल्पिक हल मिल गया है:
private var func : Function;
public function MyObject()
{
func = onHitCB;
}
और इस स्मृति रिसाव भले ही मैं अभी भी पारित साफ हो जाएगा onHitCB पैरामीटर के रूप में। तो इसका मतलब यह होगा कि यह एचआईटीसीबी प्राप्त करने के लिए "गेटर" फ़ंक्शन नहीं है लेकिन कुछ और मेमोरी रिसाव का कारण बनता है?
मैं बहुत उलझन में हूं। यह मेमोरी रिसाव का कारण कैसे बन सकता है:
public function MyObject()
{
}
public function update() : void
{
CollisionManager.onHits(myShape, onHitCB);//empty function
}
public function onHitCB(hitObject : *) : void
{
//removed all code to test this problem
}
लेकिन यह नहीं? :
private var func : Function;
public function MyObject()
{
func = onHitCB;
}
public function update() : void
{
CollisionManager.onHits(myShape, onHitCB);//empty function
}
public function onHitCB(hitObject : *) : void
{
//removed all code to test this problem
}
और क्या इस कामकाज को करने की कोई आवश्यकता नहीं है?
क्यों HitCB को CollisionManager के लिए क्लास सदस्य नहीं बनाते? आपके काम की तरह लगता है गुंजाइश खो रहा है। ऑन हिट्स की आखिरी पंक्ति पर कॉलबैक = शून्य की कोशिश करें; –
ऑनबिट के अंत में कॉलबैक को शून्य पर सेट करने का प्रयास किया लेकिन रिसाव अभी भी मौजूद है। अब तक, फ़ंक्शन के लिए स्थानीय संदर्भ रखना एकमात्र कामकाज है जिसे मैं ढूंढने में सक्षम था। – Godfather