मेरी blog post यहाँ से लिया: http://i.ndigo.com.br/2012/01/releasing-nsurlconnection-and-its-delegate/
आप, के रूप में NSURLConnection
के लिए, वहाँ प्रतिनिधि के लिए एक विशेष विचार है प्रतिनिधि वस्तु के लिए अतिरिक्त ध्यान का भुगतान करना होगा: यह हमेशा बनी रहती है।
http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html#//apple_ref/doc/uid/20001697-BAJDDIDG
initWithRequest: प्रतिनिधि:
विशेष ध्यान: कनेक्शन प्रतिनिधि बरकरार रखती है। यह कनेक्शन लोड होने पर प्रतिनिधि को जारी करता है, विफल रहता है, या रद्द कर दिया जाता है।
तो, इसे ध्यान में रखते हुए, आपके पास यह सुनिश्चित करने के लिए कई विकल्प हैं कि आपका प्रतिनिधि सही ढंग से रिलीज़ हो जाएगा और मैं 2 सरल लोगों को समझाने की कोशिश करूंगा।
पहला, और सबसे अधिक उपयोग किया जाने वाला, उसी वर्ग का उपयोग करना है जो NSURLConnection को प्रतिनिधि के रूप में प्रारंभ करता है।
[[NSURLConnection alloc] initWithRequest:request self];
कि ऐसा करने से, अपने वर्ग बनाए रखने गिनती 1 की वृद्धि की जाएगी जब कनेक्शन शुरू होता है और उसके बाद 1 द्वारा कम डे के बाद कनेक्शन के लोड हो, विफल रहता है, या रद्द कर दिया जाता है, कोई स्मृति लीक हो जाती है।
दूसरा विकल्प, जिसे आप करने का प्रयास कर रहे हैं, सभी कनेक्शन कॉल को संभालने के लिए किसी अन्य ऑब्जेक्ट का उपयोग करना है। यह ठीक काम करता है, लेकिन आपको स्मृति के साथ अतिरिक्त ध्यान देने की आवश्यकता होगी। आपकी समस्या को हल करने के लिए आप एक साधारण चीज कर सकते हैं एक ऑटोरेलीज ऑब्जेक्ट के साथ कनेक्शन प्रारंभ करना।
//creates the handler object
MyHandlerClass *handler = [[MyHandlerClass alloc] init];
//creates the connection with handler as an autorelease object
[[NSURLConnection alloc] initWithRequest:request delegate:[handler autorelease]];
या आप सही कनेक्शन बनाने (के रूप में यह पहले से ही कनेक्शन द्वारा रखी जाएगी)
//creates the handler object
MyHandlerClass *handler = [[MyHandlerClass alloc] init];
//creates the connection with handler
[[NSURLConnection alloc] initWithRequest:request delegate:handler];
//releases handler object
[handler release];
दोनों तरीकों केवल कनेक्शन के साथ हैंडलर वस्तु स्वामित्व छोड़ देंगे के बाद अपने हैंडलर जारी कर सकता है कक्षा, जो लोड होने, विफल होने या रद्द होने के बाद हैंडलर ऑब्जेक्ट को ठीक से रिलीज़ करेगी, जिसके परिणामस्वरूप एक बार फिर कोई मेमोरी लीक नहीं होगी।
संपादित करें: उपर्युक्त विकल्पों में से किसी एक को प्रतिनिधि को जारी करने की चिंता करने की आवश्यकता नहीं है (लेकिन आपको अभी भी कनेक्शन जारी करना होगा) connection:DidFinishLoading
और connection:didFailWithError
विधियों में।
हाँ, यही मैंने सोचा था, लेकिन जब मैं ऐसा करता हूं ... मुझे निष्पादन खराब देवताओं ने मुझे मार दिया। –
असल में, मुझे पूरा यकीन है कि NSURLConnection प्रतिनिधि को बनाए रखता है (यह इस संबंध में एक अपवाद है)। – shosti
NSURLConnection वास्तव में प्रतिनिधि को बनाए रखता है, दस्तावेज़ीकरण की जांच करता है। –