6

मैं एक वर्ग (नहीं एक उदाहरण) पर नाम से एक चयनकर्ता प्रदर्शन करते हैं और अपनी वापसी मान का उपयोग करने के लिए है। मुझे लौटा हुआ उदाहरण उपयोग करने की ज़रूरत है। जाहिर है, मुझे सामान्य प्रदर्शन मिलता है चयनकर्ता रिसाव का कारण बन सकता है क्योंकि इसका चयनकर्ता चेतावनी अज्ञात है क्योंकि इस परियोजना को एआरसी के साथ संकलित किया गया है।"प्रदर्शन चयनकर्ता रिसाव का कारण बन सकता है" विकल्प जब यह रिसाव करता है?</p> <pre><code>id obj = [objClass performSelector:NSSelectorFromString(methodName) withObject:p1]; </code></pre> <p>चयनकर्ता कक्षा का एक नया उदाहरण बनाता है:

अगर मैं सही ढंग (from the answers here और अन्य), इस उदाहरण में performSelector एक रिसाव का कारण होगा (मुझे सही कर अगर मैं गलत हूँ, तो मैं सिर्फ चेतावनी अक्षम कर सकते हैं और इसके साथ किया जाना) को समझते हैं। चयनकर्ताओं के रूप में इस लागू किया जाता है:

+ (id) objectWithFile:(NSString*)p1 
{ 
    return [NSKeyedUnarchiver unarchiveObjectWithFile:p1]; 
} 

जब मैं स्ट्रिंग से चयनकर्ता का उपयोग करने के लिए है और चयनकर्ता बनाता है और वस्तु का एक नया उदाहरण देता है मेरे पास क्या विकल्प हैं?

मैंने एनएसआईएनवोकेशन माना लेकिन इसकी getReturnValue विधि के लिए मुझे अपना आवंटित बफर प्रदान करने की आवश्यकता है जिसमें वापसी मूल्य संग्रहीत किया जाता है। मुझे यकीन नहीं है कि यह एआरसी और कक्षा विधियों के साथ भी काम करता है, या क्या मुझे बस __bridge_transfer पर malloc'ed वापसी मूल्य बफर id पर डाला गया है और यह सब कुछ है।

+0

मुझे अभी तक समझ में नहीं आता है कि आपके मामले में आपको रिसाव क्यों होगा। 'objectWithFile:' एक ऑटोरेलेज्ड ऑब्जेक्ट देता है क्योंकि यह एक आवंटन/प्रतिलिपि/नई विधि नहीं है। –

+0

मुझे यकीन नहीं है कि मैं इसे सही ढंग से समझता हूं। मान लें कि मैं अनारक्षित वस्तु के बजाय [ऑब्जेक्ट नया] वापस लौटाता हूं, वह भी एक ऑटोरेलीज ऑब्जेक्ट देता है लेकिन फिर रिसाव होगा? या रिसाव ** केवल ** तब होता है जब प्रदर्शनकर्ता चयनकर्ता स्वयं को आवंटित करता है, नया या प्रतिलिपि बनाता है? – LearnCocos2D

उत्तर

5

objectWithFile:की एक विधि "alloc, कॉपी, init, mutableCopy, और नए परिवार" नहीं है और इसलिए "Clang/ARC documentation" के अर्थ में एक "Unretained वापसी मूल्यों" विधि है:

एक विधि या फ़ंक्शन जो एक बनाए रखने योग्य ऑब्जेक्ट प्रकार देता है लेकिन एक बनाए रखा मान वापस नहीं करता है यह सुनिश्चित करना चाहिए कि ऑब्जेक्ट अभी भी रिटर्न सीमा पर मान्य है।
...
सबसे बुरे मामले में, इसमें एक ऑटोरेलीज शामिल हो सकता है, लेकिन कॉलर्स को यह मानना ​​नहीं चाहिए कि मान वास्तव में ऑटोरेलीज पूल में है।

कोई फर्क नहीं पड़ता कि आप विधि के अंदर क्या करते हैं, कॉलर को लौटाई गई वस्तु को रिलीज़ करने की आवश्यकता नहीं है।

इसलिए मुझे नहीं लगता कि आपके पास आपके कोड में मेमोरी लीक है।

+0

धन्यवाद, यह समझ में आता है। यह भी मेरे अवलोकन की पुष्टि करता है क्योंकि यदि मजबूत रेफरी के साथ नहीं रखा जाता है तो लौटाई गई वस्तुओं को हटा दिया जाता है। – LearnCocos2D

संबंधित मुद्दे