2012-03-10 12 views
6

एआरसी में [[something retain] autorelease] के समतुल्य क्या है?एआरसी में '[[कुछ बनाए रखने] autorelease]' के बराबर क्या है?

मुझे एक समस्या है जहां कक्षा डीबीआरक्वेट मेरे प्रतिनिधि को पूरा करने के संकेत देने के लिए बुलाती है। मेरा प्रतिनिधि तब डीबीआरक्वेट इंस्टेंस को शून्य पर सेट करता है, जो इसे डेलोक करता है। लेकिन फिर जब स्टैक मेरे प्रतिनिधि से बाहर निकलता है और डीबीआरक्वेट पर वापस कूदता है, तो निश्चित रूप से यह दुर्घटनाग्रस्त हो जाता है।

अगर मैं एआरसी में नहीं था, तो मेरे प्रतिनिधि में मैं बस इसके संदर्भ को जारी करने से पहले [[theDbRequest retain] autorelease] करता था, ताकि यह अगले लंबे लूप को स्वचालित रूप से तब तक लंबे समय तक जीवित रहे।

एआरसी में मुझे क्या करना चाहिए?

उत्तर

6

कैसे की तरह

__strong DBRequest * myself = self; 
[delegate reportDone]; 

कुछ जोड़ने के बारे में मुझे लगता है कि समारोह असामयिक मृत्यु से रोकता के अंत तक स्वयं वस्तु को बढ़ा देते हैं।

+0

मैं * ड्रॉपबॉक्स कोड खोल सकता हूं और ऐसा कर सकता हूं ... मैं उम्मीद कर रहा था कि मैं ऐसा कर सकता हूं उनके कोड को संशोधित करने की आवश्यकता के बिना। – Chris

+3

@ क्रिस, ठीक है, मुझे नहीं पता था कि बिट उनके कोड में था। मुझे यकीन नहीं है लेकिन आप अपने कोड में '__autoreleasing DBRequest * theDBRequest = dbRequest' डाल सकते हैं। –

+1

अंत में, यह वही है जो मैंने किया :) – Chris

3

मेरा प्रतिनिधि तब डीबीआरक्वेट इंस्टेंस को शून्य पर सेट करता है, जो इसे अस्वीकार करता है। लेकिन फिर जब स्टैक मेरे प्रतिनिधि से बाहर निकलता है और डीबीआरक्वेट पर वापस कूदता है, तो निश्चित रूप से यह दुर्घटनाग्रस्त हो जाता है।

निश्चित रूप से यह हमेशा एक खराब रणनीति थी, और आपका [[theDbRequest retain] autorelease] हमेशा समस्या को कवर करता था, हाँ?

बस कुछ भी नहीं करें। तो आपका इंस्टेंस वैरिएबल चारों ओर चिपक जाता है; तो क्या? आप जानते हैं कि जब आप को हटा दिया जाता है तो एआरसी इसे आपके लिए छोड़ देगा।

महत्वपूर्ण बात यह है theDbRequest जारी नहीं करने के लिए, लेकिन आप (प्रतिनिधि) नहीं के बराबर करने के लिए करने के लिए theDbRequest के संदर्भ सेट करने के लिए, तो यह आपको वापस कॉल करने के लिए जब आप अब मौजूद नहीं हैं की कोशिश नहीं करता है। ऐसा करने के लिए आपका खुद का डीलोक एक अच्छा स्थान होगा।

आशा है कि मैं इस मुद्दे को सही ढंग से समझ रहा हूं। यदि नहीं, तो कुछ कोड पोस्ट करें!

+0

मुझे लगता है कि यह एक है प्रश्न में ड्रॉपबॉक्स एपीआई के कारण होने वाली समस्या एआरसी का उपयोग करके लिखी नहीं गई है, इसलिए किसी भी प्रकार से सवाल में स्वामित्व का पता नहीं लगा सकता है। मुझे पता है कि जब भी आप एक ऐसे प्रतिनिधि को बुलाते हैं जो खुद को मुक्त करने की संभावना रखता है, तो पहले 'स्वयं को बनाए रखने वाले ऑटोरेलीज़' को कॉल करना एक अच्छा विचार है, लेकिन ड्रॉपबॉक्स एपीआई ऐसा नहीं कर रहा है, इसलिए मुझे कुछ करना है। पर क्या? – Chris

+0

यहां कुछ दिलचस्प भी है, अगर मैं डीबीआरक्वेट को शून्य पर सेट नहीं करता हूं, तो यह कभी भी रिलीज़ नहीं होता है (यहां तक ​​कि मेरे प्रतिनिधि को रिहा होने के बाद भी)। एआरसी रहस्यमय तरीके से काम करता है? गैर-आर्क भूमि पर वापस जाने के लिए प्रेरित ... – Chris

+0

क्षमा करें मुझे ड्रॉपबॉक्स एपीआई नहीं पता है। क्या नामकरण समस्या हो सकती है? एआरसी एक गैर-एआरसी फ़ाइल से एआरसी फ़ाइल में पार करते समय विधि के * नाम * के आधार पर स्मृति को प्रबंधित करने के तरीके के बारे में धारणा करता है। डब्ल्यूडब्ल्यूडीसी 2011 वीडियो बहुत अच्छा है जो उससे संबंधित है; एआरसी को क्या करना है जो एक क्वालीफायर जोड़कर इसके आसपास काम करने के तरीके हैं। – matt

3

@matt कहते हैं अगर आप बस कर कुछ भी नहीं एआरसी को साफ करना चाहिए जब आपके वस्तु पुनः आवंटित की जाती है - बताए DBRequest आपके द्वारा बनाए गए एक उदाहरण चर हैंडल करने के लिए है कि (निश्चित रूप से वस्तु आप बना रहे हैं outlasts अपने वस्तु प्रदान की गई)।

आप पुनःआवंटन करने के लिए अपने वस्तु DBRequest पहले मर जाता है तो आप एक एआरसी-संगत "चाल" [[theDbRequest retain] autorelease] के बराबर की जरूरत की जरूरत है। अब जब तक आप अपने स्वयं के ऑटो रिलीज पूल का निर्माण नहीं कर रहे हैं, तब तक आपका पिछला दृष्टिकोण वर्तमान घटना के अंत में ट्रिगर होगा। के बाद कि तर्क कोशिश:

  1. अपने वर्ग जो केवल theDbRequestnil करने के लिए सेट करने के लिए एक विधि जोड़ें, चलो इस cleanUpTheDbRequest फोन करते हैं।
  2. [self performSelectorOnMainThread:@selector(cleanUpTheDbRequest) withObject:nil waitUntilDone:NO] आह्वान करने के लिए अपने प्रतिनिधि कॉलबैक बजाय सीधे nil देने की theDbRequest

यह करने के लिए, बस अपने autorelease "चाल" के रूप में किया था बदलें वर्तमान घटना के अंत के बाद तक nil के बताए देरी चाहिए।यह भी काम करता है यदि आपका DBRequest कई घटनाओं में रहता है - autorelease ईवेंट के अंत में पिछली विधि में शामिल होता है, इस विधि को प्रतिनिधि विधि में शामिल किया जाता है।

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