31

मैंने अपनी परियोजना को एआरसी में बदल दिया है, और मुझे समझ में नहीं आता कि मुझे strong या weak आईबीओटलेट्स के लिए उपयोग करना है या नहीं। Xcode ऐसा करते हैं: अगर एक उदाहरण के लिए एक UILabel बनाने इंटरफ़ेस बिल्डर में, और मैं अपने ViewController के सहायक संपादक के साथ कनेक्ट, यह इस बनाने के लिए:आईबीओलेटलेट के लिए कमजोर या मजबूत और अन्य

@property (nonatomic, strong) UILabel *aLabel; 

यह strong का उपयोग करता है, बजाय मैं RayWenderlich वेबसाइट पर एक ट्यूटोरियल पढ़ें यह कहता है:

लेकिन इन दो विशेष गुणों के लिए मेरे पास अन्य योजनाएं हैं। strong के बजाय, हम उन्हें weak के रूप में घोषित करेंगे।

@property (nonatomic, weak) IBOutlet UITableView *tableView; 
@property (nonatomic, weak) IBOutlet UISearchBar *searchBar; 

Weak सभी आउटलेट संपत्तियों के लिए रिश्ते की सिफारिश की है। ये दृश्य ऑब्जेक्ट्स पहले से ही व्यू कंट्रोलर के दृश्य पदानुक्रम का हिस्सा हैं और उन्हें कहीं और बनाए रखने की आवश्यकता नहीं है। आपके आउटलेट weak घोषित करने का बड़ा लाभ यह है कि यह आपको viewDidUnload विधि लिखने का समय बचाता है।

वर्तमान में हमारे viewDidUnload इस तरह दिखता है:

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    self.tableView = nil; 
    self.searchBar = nil; 
    soundEffect = nil; 
} 

अब आप निम्नलिखित करने के लिए इसे आसान बनाने में कर सकते हैं:

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    soundEffect = nil; 
} 

तो strong के बजाय, weak उपयोग करें, और videDidUnload में सेट को शून्य पर हटाएं, इसके बजाय एक्सकोड का उपयोग करें ई strong, और viewDidUnload में self... = nil का उपयोग करें।

मेरा प्रश्न है: मुझे strong का उपयोग कब करना है, और जब weak? मैं तैनाती लक्ष्य आईओएस 4 के लिए भी उपयोग करना चाहता हूं, तो मुझे unsafe_unretain का उपयोग कब करना है? एआरसी के साथ strong, weak और unsafe_unretain का उपयोग करते समय कोई भी मुझे एक छोटे से ट्यूटोरियल के साथ अच्छी तरह से समझाने में मदद कर सकता है?

उत्तर

69

आईओएस विकास पॉडकास्ट अंगूठे

एक माता पिता के एक बच्चे वस्तु के लिए एक संदर्भ है, तो आपको एक strong संदर्भ का उपयोग करना चाहिए का एक नियम है। जब किसी बच्चे के मूल ऑब्जेक्ट का संदर्भ होता है, तो आपको weak संदर्भ या unsafe_unretained एक (यदि पूर्व उपलब्ध नहीं है) का उपयोग करना चाहिए। एक ठेठ परिदृश्य तब होता है जब आप प्रतिनिधियों से निपटते हैं। उदाहरण के लिए, UITableViewDelegate एक नियंत्रक वर्ग नहीं रखता है जिसमें तालिका दृश्य होता है।

enter image description here

यहाँ एक सरल स्कीमा मुख्य अवधारणाओं पेश करने के लिए।

मान लीजिए पहले ए, बी और सी strong संदर्भ हैं। विशेष रूप से, सी में strong इसके माता-पिता से संबंधित है। जब obj1 जारी किया जाता है (कहीं), एक संदर्भ अब मौजूद नहीं है लेकिन आपके पास एक रिसाव है क्योंकि obj1 और obj2 के बीच एक चक्र है। (केवल उन उद्देश्यों की व्याख्या के लिए ) को बनाए रखने में गिना जाता है के मामले में बोलते हुए, obj1, 2 की एक बनाए रखने गणना (obj2 यह करने के लिए एक strong संदर्भ में है) है, जबकि obj2 1. की गिनती को बनाए रखने अगर obj1 जारी किया गया है है, अपने को बनाए रखने गिनती है अब 1 और इसकी dealloc विधि नहीं कहा जाता है। obj1 और obj2 अभी भी स्मृति में रहते हैं लेकिन किसी के पास उनका संदर्भ नहीं है: लीक

contary पर, यदि केवल ए और बी strong रेफरी और सी weak के रूप में योग्य है, तो ठीक है। आपके पास कोई रिसाव नहीं है वास्तव में, जब obj1 जारी किया जाता है, यह obj2 भी जारी करता है। रखरखाव की गणना के मामले में बोलते हुए, ओबीजे 1 में 1 की गिनती गिनती है, ओबीजे 2 में 1 की बरकरार है। यदि ओबीजे 1 जारी किया गया है, तो इसकी बरकरार संख्या अब 0 है और इसकी dealloc विधि कहा जाता है। obj1 और obj2 स्मृति से हटा दिए जाते हैं।

एक सरल सुझाव: वस्तु ग्राफ के मामले में लगता है कि जब आप एआरसी के साथ सौदा करना शुरू करें।

अपने पहले प्रश्न के बारे में, दोनों समाधान मान्य है जब आप XIBs के साथ सौदा कर रहे हैं। जब आप मेमोरी चक्र से निपटते हैं तो सामान्य weak संदर्भों का उपयोग किया जाता है। के संबंध में XIBs फ़ाइलें, अगर आप का उपयोग strong आप viewDidUnload में nil स्थापित करने के लिए के बाद से यदि आप यह मत करो स्मृति कम परिस्थितियों में, आप अप्रत्याशित लीक कारण बन सकता है की जरूरत है। आप उन्हें dealloc में रिलीज़ नहीं करते हैं क्योंकि एआरसी आपके लिए यह करेगा। weak इसके बजाय उस ऑब्जेक्ट की आवश्यकता नहीं है, जब लक्ष्य ऑब्जेक्ट नष्ट हो जाता है, तो वे मान nil स्वचालित रूप से सेट होते हैं। अब कोई लटकती पॉइंटर्स नहीं।

यदि आप रुचि रखते हैं, तो मैं आपको friday-qa-2012-04-13-nib-memory-managementमाइक एश द्वारा पढ़ने का सुझाव देता हूं।

अपने दूसरे प्रश्न के बारे में, यदि आपको weak के बजाय आईओएस 4 का समर्थन करने की आवश्यकता है, तो आपको unsafe_unretained का उपयोग करना होगा।

के भीतर तो वहाँ प्रश्न/उत्तर के एक बहुत हैं।यहां मुख्य वाले:

How do I replace weak references when using ARC and targeting iOS 4.0?

What kind of leaks does automatic reference counting in Objective-C not prevent or minimize?

using ARC, lifetime qualifier assign and unsafe_unretained

strong/weak/retain/unsafe_unretained/assign

आशा है कि मदद करता है।

अद्यतन

प्रति shaunlim की टिप्पणी के रूप में, आईओएस 6 से शुरू viewDidUnload विधि मान्य नहीं है। यहां मैं वास्तव में रॉब के उत्तर को देखने का सुझाव देता हूं: iOS 6 - viewDidUnload migrate to didReceiveMemoryWarning?

+0

के लिए धन्यवाद उत्तर – Piero

+0

आप कहते हैं कि, अगर मैं मजबूत उपयोग करता हूं तो Iiboutlet के लिए मुझे viewdidunload में शून्य का उपयोग करना होगा, और कम स्मृति के लिए मेरे पास लीक नहीं है, इसके बजाय कमजोर के साथ मुझे videwdidunlaod में शून्य का उपयोग करने की आवश्यकता नहीं है, और कम स्मृति के लिए चेतावनी यह मजबूत समाधान या कमजोर बेहतर है? – Piero

+0

यह वही है। 'कमजोर' का उपयोग करके आप हाथ से लिखित कोड (आपके मामले में दो पंक्तियां) पर समय बचा सकते हैं। लेकिन, एक्सकोड आपके लिए यह करता है। मेरी व्यक्तिगत राय मुझे 'मजबूत' का उपयोग करना पसंद है। –

11

आप उन ऑब्जेक्ट्स के लिए कमजोर उपयोग कर सकते हैं जो आईबीओटलेट्स के माध्यम से आईबी में ऑब्जेक्ट्स से जुड़े हुए हैं क्योंकि इस मामले में ऑब्जेक्ट्स तब तक वहां होंगे जब पर्यवेक्षण वहां होगा। ऐसा इसलिए है क्योंकि पर्यवेक्षक के पास इसके सबव्यूज़ में एक मजबूत सूचक है।

यदि आप जिस पॉइंटर को परिभाषित कर रहे हैं वह किसी ऑब्जेक्ट का एकमात्र सूचक है तो आपको इसे मजबूत घोषित करना चाहिए।

यदि आप एक पंजीकृत डेवलपर हैं तो मैं दृढ़ता से अनुशंसा करता हूं कि आप WWDC11 और WWDC12 से वीडियो देखें।एक और अच्छा संसाधन से Stanford.

+0

क्या डब्ल्यूडब्ल्यूडीसी 12 वीडियो अभी तक उपलब्ध हैं? – borrrden

+0

हाँ, वे हैं! इस साल वास्तव में तेजी से। – dasdom

+0

ठीक है, लेकिन मुझे समझ में नहीं आ रहा है, मेरा प्रश्न कवर भी असुरक्षित है, लेकिन आईबीओलेट के लिए मैं अच्छी तरह से समझाता हूं, क्यों सेब मजबूत उपयोग करता है? ... कमजोर उपयोग करने के बजाय ... तो मुझे सेब का पालन करना होगा? या raywenderlich ट्यूटोरियल का पालन करें जहां मैं एक स्निपेट ऊपर लिखता हूं जो कमज़ोर का उपयोग करता है? – Piero