2014-09-16 7 views
6

इन ब्लॉकों हमेशा एक ही परिस्थितियों (जब बंद निष्पादित किया जा रहा है, लेकिन स्वयं पुनः आवंटित की जाती किया गया था) के तहत असफल होगा?तर्कसंगत रूप से कमजोर के बराबर है! स्विफ्ट में

{ [unowned self] in 
    //use self 
    self.number = self.number + 1 
} 

{ [weak self] in 
    //use self! 
    self!.number = self!.number + 1 
} 
+0

आप मतलब है कि आप दुर्घटना मिलता है, इस कोड को निष्पादित करते समय? – Sandeep

+0

हां, अगर स्वयं को हटा दिया गया है। मैं पूछ रहा हूं कि क्या दोनों ब्लॉक हमेशा तर्कसंगत व्यवहार करेंगे? –

उत्तर

4

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

कमजोर के मामले के लिए, अपने उदाहरण के रूप में, कमजोर ब्लॉक के अंदर एक वैकल्पिक प्रकार है, इसलिए वहाँ भी एक मूल्य हो सकता है या यह नहीं के बराबर हो सकता है। यह जांचना आपकी ज़िम्मेदारी है कि क्या मूल्य मौजूद है और उस पर कॉल विधियां हैं। उपरोक्त के रूप में यदि आप अनचाहे ऑपरेटर (!) का उपयोग करते हैं, जब स्वयं को हटा दिया गया है, तो यह निश्चित रूप से दुर्घटनाग्रस्त हो जाता है। इसलिए, कोड के दोनों संस्करण क्रैश हो जाते हैं, अगर ऐसा होता है कि ब्लॉक अभी भी निष्पादित हो रहा है और स्वयं को औसत समय में हटा दिया गया है।

तो, मैं वैकल्पिक चेकों का उपयोग कर जैसे क्रैश की रक्षा के लिए कमजोर उपयोग करने के लिए सुझाव देते हैं,

{ [weak self] in 
    if let me = self { 
     me.number = me.number + 1 
    } 
} 
+0

"और अगर, कुछ कैसे स्वयं deallocates जबकि ब्लॉक को क्रियान्वित" या से पहले ब्लॉक निष्पादित करता – newacct

1

हाँ, उन बराबर हैं। यही कारण है कि unowned की बात है - यह सिर्फ weak तरह है, सिवाय इसके कि आप एक वैकल्पिक से निपटने के लिए और इसे खोलने, क्योंकि इसके प्रकार unwrapped गैर वैकल्पिक प्रकार है की जरूरत नहीं है; यह weak है जो हमेशा हर उपस्थिति में जबरन अवांछित होता है।

+0

हालांकि 'unowned' असुरक्षित है - अगर' self' पुनः आवंटित की जाती है यह दुर्घटना होगा। –

+1

@AaronBrager: कोई और अधिक "असुरक्षित" बल unwrapping से। सवाल यह है कि अगर वे वही हैं। यदि यह 'कमजोर' था, और वस्तु को हटा दिया गया है, तो मूल्य 'शून्य 'होगा। और 'nil' मान के साथ एक वैकल्पिक बल को अनचाहे कर देगा। – newacct

1

की तरह इस

{ [weak self] in 

    guard let weakSelf = self else { 
     return 
    } 

    weakSelf.number = weakSelf.number + 1 
} 

@ जोस की टिप्पणी का धन्यवाद यह का उपयोग करना चाहिए, ध्यान रखें कि भले ही निम्न कोड पल में काम करता है, लेकिन यह एक संकलक बग माना जाता है और https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160118/007425.html से बचा जाना चाहिए।

तुम भी self इस तरह खोलने कर सकते हैं:

{ [weak self] in 

    guard let `self` = self else { 
     return 
    } 

    // Now you can use `self` safely 
    self.number = self.number + 1 
} 
+0

यह हालांकि एक संकलक बग है और बचा जाना चाहिए: https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160118/007425.html –

+0

@ जोस धन्यवाद इस ओर इशारा करते हुए के लिए! मैं इस पोस्ट में एक नोट जोड़ूंगा ताकि सभी जानते हों! –

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