2012-08-24 13 views
6

के तहत -DDDUDload में कमजोर और मजबूत गुण Iphone विकास के लिए नया हूं। मैं अपने प्रोजेक्ट के लिए एआरसी का उपयोग कर रहा हूं। जहां तक ​​मैं एआरसी का उपयोग कर समझ गया, हमें किसी ऑब्जेक्ट को मैन्युअल रूप से रिलीज़ करने की आवश्यकता नहीं है। लेकिन, मैंने कुछ स्थानों पर देखा है, लोग स्पष्ट रूप से एआरसी का उपयोग करने के बाद भी ViewDidUnload में अपनी ऑब्जेक्ट को शून्य पर सेट करते हैं।एआरसी

@property (unsafe_unretained, nonatomic) IBOutlet MKMapView *mapViewOutlet; 
@property (unsafe_unretained, nonatomic) IBOutlet UIToolbar *toolBar; 
@property (strong,nonatomic) NSMutableArray *dataArray; 

और .m इस प्रकार है::

उदाहरण के लिए, ज फ़ाइल में मैं इस तरह कुछ है

- (void)viewDidUnload 
{ 
    [self setMapViewOutlet:nil]; 
    [self setToolBar:nil]; 
    [super viewDidUnload]; 
    self.dataArray=nil; 
} 

मेरा प्रश्न है, यह वास्तव में स्पष्ट रूप में नहीं के बराबर निर्दिष्ट करने के लिए आवश्यक है एआरसी के तहत भी ViewDidUnload?

उत्तर

10

viewDidUnload विधि का पूरा बिंदु उस डेटा को रिलीज़ करना है जिसे आपको वास्तव में आवश्यक नहीं है, ताकि स्मृति मुक्त हो सके। पढ़ें the documentation:

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

तो आप अब वस्तुओं जारी करने और कुछ स्मृति को मुक्त करने के सिस्टम में मदद करने में nil के गुण स्थापित कर रहे हैं। लेकिन निश्चित रूप से यह संपत्ति प्रकार पर निर्भर करता है - मजबूत गुण "आपका" हैं और केवल आप तय कर सकते हैं कि उन्हें अभी जारी करना है या नहीं (nil पर सेट करके) या नहीं। कमजोर गुण पहले से ही nil हो सकते हैं, उदाहरण के लिए यदि उन्होंने मुख्य दृश्यों के साथ जारी किए गए कुछ विचारों की ओर इशारा किया। और unsafe_unretained गुण एक विशेष जानवर हैं। जिस वस्तु को वे इंगित करते हैं वह पहले ही रिलीज़ हो सकता है, लेकिन इसका मतलब यह नहीं है कि वे nil पर स्वचालित रूप से सेट किए गए थे। तो आपको यह सुनिश्चित करने के लिए कि आप बाद में जारी ऑब्जेक्ट का उपयोग नहीं करेंगे, आपको या तो "सुरक्षित" संपत्ति प्रकारों (मजबूत/कमजोर) में से किसी एक का उपयोग करना चाहिए, या असुरक्षित गुणों को nil पर सेट करना चाहिए। इस मामले में कोई कठोर नियम नहीं हैं, आपको स्थिति के बारे में सोचना होगा और विभिन्न गुणों के लिए इसका क्या अर्थ है।

वैसे, viewDidUnload आईओएस 6 में बहिष्कृत हो रहा है, जहां अब कम स्मृति स्थितियों के तहत कोई विचार जारी नहीं किया जा रहा है। आपको अभी भी didReceiveMemoryWarning कॉलबैक प्राप्त होता है, ताकि यदि आप चाहें तो वहां कुछ संसाधन जारी कर सकते हैं। दोबारा, मेरा सुझाव है कि आप दस्तावेज पढ़ते हैं और कुछ परीक्षण चलाते हैं यह देखने के लिए कि क्या होता है और तय करें कि आपको क्या करना चाहिए।

+0

लेकिन, अगर मैं शून्य पर सेट नहीं करता हूं, तो सिस्टम स्वचालित रूप से एआरसी में स्मृति को मुक्त कर देगा? – Raj

+0

आखिरकार, हाँ। एआरसी के तहत रिसाव बनाने के लिए यह कठिन है (एर)। यह तय करने के लिए आप पर निर्भर है कि क्या आप ऐप को मेमोरी चेतावनी प्राप्त करते समय स्मृति के कुछ बड़े हिस्से को मुक्त करके सिस्टम की मदद कर सकते हैं। – zoul

+0

ठीक है। मैं यह जवाब स्वीकार करूंगा। – Raj

2

जब आप unsafe_unretained उपयोग कर रहे हैं, तो आप क्योंकि यह शून्य परोक्ष को निर्दिष्ट नहीं किया जाएगा शून्य को असाइन करना चाहिए, जहां यह हो जाएगा कमजोर संदर्भ का मामला है निहित रूप से निपटाया गया है। इसलिए किसी भी खतरनाक संदर्भ से बचने के लिए आपको असुरक्षित के मामले में शून्य को असाइन करने की आवश्यकता है।

+0

हाँ मैंने भी यही सोचा। लेकिन मैंने कुछ स्थानों में भी कमजोर संदर्भों को शून्य में स्थापित किया है। मेरे प्रश्न में आप भी मजबूत संदर्भ सेट को शून्य में देख सकते हैं। – Raj

3

एआरसी केवल उन गुणों को रिलीज़ करेगा जो किसी ऑब्जेक्ट का मजबूत संदर्भ नहीं रखते हैं। आपके मामले में, ये सभी मजबूत संदर्भ हैं, इसलिए उन्हें तब तक रखा जाएगा जब तक वे स्पष्ट रूप से शून्य पर सेट न हों।

viewDidUnload विधि का अर्थ यह नहीं है कि आपका UIViewController स्मृति से हटा दिया गया है, इसका मतलब यह है कि इसके विचार स्मृति (iOS Developer - ViewController lifecycle) से हटा दिए जाते हैं।

इस मामले में, आपके UIViewController स्मृति में रहता है, और इसलिए इसकी गुणधर्म भी बनी हुई है, जब तक कि वे स्पष्ट रूप से शून्य पर सेट न हों।

+0

मेरे मामले में, वे सभी मजबूत संदर्भ नहीं हैं। आपकी जानकारी के लिए, आईओएस 4 में कमजोर समर्थित नहीं है, इसके बजाय हम असुरक्षित-अप्रत्याशित उपयोग करते हैं, जो कुछ समय लटकते पॉइंटर्स बना सकता है। कार्यक्षमता के अनुसार दोनों समान हैं – Raj

+0

सही, क्षमा करें, मैं कमजोर कीवर्ड की तलाश में था (अब केवल आईओएस 5 के लिए विकसित)। – Resh32

+0

और जहां तक ​​मुझे पता है कि एआरसी स्वचालित संदर्भों के लिए स्वचालित रूप से डेलोक को कॉल करेगा। इसलिए हमें उन्हें स्पष्ट रूप से शून्य करने की आवश्यकता नहीं है। जहां कमजोर संदर्भों के लिए हम इसे खतरे में डाल रहे हैं ताकि लटकने वाले पॉइंटर्स से बच सकें कुछ मामलों में संभव हो सकता है – Raj