2014-09-22 8 views
10

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

weak var weakSelf = self 
object.setCompletionHandler { (error) -> Void in 
    if(!error){ 
     weakSelf?.tableView.reloadData() 
    } 
    weakSelf?.progressHUD?.hide(false) 
} 

कोई भी विचार स्विफ्ट कैप्चरिंग के साथ काम नहीं कर रहा:

object.setCompletionHandler { [weak self] (error) -> Void in 
    if(!error){ 
     self?.tableView.reloadData() 
    } 
    self?.progressHUD?.hide(false) 
} 

हालांकि, अगर मैं बंद के बाहर स्वयं के लिए एक कमजोर वर की घोषणा, यह स्मृति रिसाव को ठीक करता है, इस तरह ?

+0

वहाँ एक चक्र को बनाए रखने – newacct

उत्तर

-3

निम्नलिखित का प्रयास करें:

object.setCompletionHandler { [unowned self] (error) ->() in 
    if(!error){ 
     weakSelf?.tableView.reloadData() 
    } 
    weakSelf?.progressHUD?.hide(false) 
} 
+0

के रूप में मूल पोस्ट में उल्लेख किया नहीं होना चाहिए, न कमजोर या बिना स्वामित्व वाले स्मृति रिसाव हल करता है। हालांकि धन्यवाद। –

11

आप एक वर्ग उदाहरण के एक संपत्ति के लिए एक बंद असाइन करते हैं, और बंद उदाहरण या उसके सदस्यों का हवाला देते हुए कि उदाहरण कैप्चर करता है, आप एक मजबूत संदर्भ चक्र पैदा करेगा बंद करने और उदाहरण के बीच। इन मजबूत संदर्भ चक्रों को तोड़ने के लिए स्विफ्ट कैप्चर सूचियों का उपयोग करता है। source Apple

source sketchyTech सबसे पहले, यह स्पष्ट करना है कि इस पूरे मुद्दे केवल बंद है जहाँ हम "एक वर्ग उदाहरण के एक संपत्ति के लिए एक बंद" बताए जाते हैं चिंताओं महत्वपूर्ण है। इसे प्रत्येक नियम के साथ ध्यान में रखें। नियम:

  1. उपयोग कमजोर कब्जा करता है, तो वर्ग उदाहरण या संपत्ति एक वैकल्पिक
  2. उपयोग बिना स्वामित्व वाले अगर वर्ग उदाहरण या संपत्ति गैर वैकल्पिक है और कभी नहीं के बराबर
  3. करने के लिए सेट किया जा सकता है "आप चाहिए ... कीवर्ड में उपयोग करें, भले ही आप पैरामीटर नाम, पैरामीटर प्रकार, और वापसी प्रकार "

अपने प्रश्न के उत्तर में कोई बनाए रखने चक्र नहीं होना चाहिए।

4

आप ने कहा कि progressHUD मालिक दृश्य नियंत्रक (स्वयं) द्वारा बनाए रखा है और आप अपने बंद में इसे संदर्भ ... इसलिए कब्जा सूची में जोड़ने के लिए और फिर बंद में कब्जा चर का उपयोग इस प्रकार है:

object.setCompletionHandler { [weak self] (error) -> Void in 
    if(!error){ 
     self?.tableView.reloadData() 
    } 
    self?.progressHUD.hide(false) 
} 
+0

अनोखे संदर्भों को पूरी तरह से अनचाहे किया गया है, इसलिए 'स्वयं? .tableView' को' self.tableView' में बदला जाना चाहिए। –

+0

आप सही @zxzxlch हैं, मैंने अपने स्वयं के समाधान को कमजोर स्वयं को बदलकर, और कैप्चर सूची से प्रगति को छोड़कर अपना समाधान संपादित किया है। कोई बरकरार चक्र नहीं होना चाहिए। – dferrero

-1

यह मैं इसे कैसे कर रहे हैं है:

object.setCompletionHandler { [weak self] (error) -> Void in 
    if let weakSelf = self { 
     if (!error) { 
      weakSelf.tableView.reloadData() 
     } 

     weakSelf.progressHUD?.hide(false) 
    } 
} 
+3

यह बिल्कुल पीछे है। 'मजबूत' स्वयं को 'मजबूत' करने के लिए नाम बदलें। 'चलो' आपको एक मजबूत संदर्भ प्राप्त करता है। –

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