9

यह SO के भीतर पहले से ही एक उत्तर प्रश्न है लेकिन मैं इसे कहीं भी में ऐप्पल दस्तावेज़ में नहीं ढूंढ सकता। क्या आप मुझे सही दिशा में निर्देशित कर सकते हैं?प्रदर्शन चयनकर्ता: ऑब्जेक्ट: और इसके बनाए रखने के व्यवहार

निम्न विषयों

Do I have to retain an object before passing it to -performSelector:withObject:afterDelay:?

the effect on retain count of performSelector:withObject:afterDelay:inModes

Is object that calls performSelector:withObject:afterDelay get retained by the NSRunLoop?

डिफ़ॉल्ट व्यवहार निम्न हो रहा है के भीतर: यह रिसीवर और तर्क (रों) बरकरार रखती है।

मैं निम्नलिखित कोड

[[self delegate] performSelector:@selector(tryToSendStoreData:) withObject:userData]; 

जहां userData एक autoreleased oject है उपयोग कर रहा हूँ।

बरकरार गिनती लॉगिंग (मुझे पता है कि यह करने के लिए मान्य नहीं हो सकता है) डेटा को बरकरार रखने में वृद्धि हुई है। जब प्रतिनिधि पर विधि लागू की जाती है, तो बनाए रखने की गणना एक के बराबर नहीं होती है।

तो, मेरा सवाल है: क्या मुझे लीक से बचने के लिए कुछ मेमोरी प्रबंधन करने की ज़रूरत है या क्या मुझे ऐप्पल सामान पर भरोसा करना है? यहां मैं अज्ञेयवादी के रूप में बात कर रहा हूं क्योंकि मुझे सही दस्तावेज़ नहीं मिल रहे हैं।

अग्रिम धन्यवाद।

+0

मेरा मानना ​​है कि गिनती बनाए रखना अब एआरसी – Dustin

+0

@ केक के तहत सटीक नहीं है। मैं इस परियोजना में एआरसी का उपयोग नहीं कर रहा हूं। धन्यवाद। –

+0

एआरसी सक्षम प्रोजेक्ट के लिए आप देख सकते हैं - http://stackoverflow.com/questions/7017281/performselector-may-cause-a-leak-because-its-selector-is- अज्ञात – rishi

उत्तर

11

आप दस्तावेज़ में गलत फ़ंक्शन देख रहे हैं।

रखें

performSelector:withObject:afterDelay: और इसी तरह के कार्य (afterDelay साथ) रिसीवर और तर्क को बनाए रखने, क्योंकि अमल बाद में

नहीं रखें

performSelector:withObject: और इसी तरह के कार्य (बिनाafterDelay) करें कुछ भी नहीं बनाए रखें, क्योंकि वे सीधे फ़ंक्शन को कॉल करते हैं। जबकि @newacct सही जवाब दे दिया है, लेकिन यह सवाल है कि @Flex_Addicted कहा था, यानी के लिए नहीं था

[[self delegate] performSelector:@selector(tryToSendStoreData:) withObject:userData]; 

[[self delegate] tryToSendStoreData:userData]; 
+0

+1। लेकिन मुझे इसके लिए कोई डॉक्टर नहीं मिल रहा है। इसके अलावा, उस कॉल को करने के बाद बरकरार गणना अपने मूल्य को क्यों बढ़ाती है? धन्यवाद। –

+0

@Flex_Addicted: अतिरिक्त सुरक्षा के लिए कार्यों को बनाए रखने के लिए यह सामान्य है और फिर उनके तर्कों को स्वत: बदलें। यही कारण है कि बरकरार गिनती को देखते हुए बेकार – newacct

+0

धन्यवाद है। फिर, यदि आप इस पर कोई दस्तावेज़ करते हैं, तो कृपया इसे लिंक करें। चीयर्स। –

10

के रूप में सटीक एक ही बात करता है एप्पल प्रलेखन कि मनाया व्यवहार से प्रशंसा पत्र वास्तव में गारंटी है। नीचे एक (आंशिक) प्रशस्ति पत्र है, लेकिन हम हुप्स वहाँ पहुँचने के लिए के एक जोड़े के माध्यम से जाना होगा -

performSelector:withObject:afterDelay: के लिए दस्तावेज़ कहा गया है कि

इस विधि aSelector प्रदर्शन करने के लिए एक टाइमर सेट वर्तमान धागे के रन लूप पर संदेश।

इसलिए अगले हम से अधिक प्रलेखन के लिए NSRunLoop के लिए हम पाते हैं सिर्फ एक ही विधि मौजूद है कि वह क्षमता रन पाश पर सामान enqueue लिए अनुमति देता है सिर और वहाँ -
performSelector:target:argument:order:modes:, जिसका प्रलेखन कहा गया है कि

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

बेशक

, कुछ भी गारंटी देता है कि [NSObject performSelector:withObject:afterDelay:] हमेशा [NSRunLoop performSelector:target:argument:order:modes:] (हालांकि यह जवाब पूरा हो सकता है अगर किसी को उस के लिए प्रलेखन के साथ आ सकता है) का उपयोग करता है, लेकिन कम से कम इस पहेलियों का जवाब देने के रहस्य दिशा में एक कदम है पवित्र ग्रंथों के साथ हमें पहेली।

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