6

यदि आपको बंद करने के अंदर self संदर्भित करने की आवश्यकता है, तो इसे बनाए रखने के चक्र को रोकने के लिए इसे weak या unowned में पास करने का अच्छा अभ्यास है।क्या बंद होने पर नहीं होने पर स्वयं के एक कार्य को पारित करना एक चक्र को पार करता है?

यदि मैं self से संबंधित फ़ंक्शन को सीधे पास करता हूं, तो क्या यह एक चक्र बनाएगा? या क्या इसे स्वयं को कमजोर करने के लिए बंद होने के अंदर घोंसला होना चाहिए?

को बंद करने में सीधे पासिंग

UIView.animateWithDuration(0.3, 
     delay: 0.0, 
     usingSpringWithDamping: 0.7, 
     initialSpringVelocity: 0.1, 
     options: .CurveEaseOut, 
     animations: self.view.layoutIfNeeded, // does this cause retain cycle? 
     completion: nil) 

रैपिंग

UIView.animateWithDuration(0.3, 
     delay: 0.0, 
     usingSpringWithDamping: 0.7, 
     initialSpringVelocity: 0.1, 
     options: .CurveEaseOut, 
     animations: { [unowned self] in 
      self.view.layoutIfNeeded() 
     }, 
     completion: nil) 

उत्तर

3

यह संदर्भ चक्र नहीं बनाना चाहिए, लेकिन अगर ऐसा होता तो भी ठीक होगा। संदर्भ चक्र केवल तब तक अस्तित्व में रहेगा जब तक कि एनीमेशन पूरा न हो जाए, उस बिंदु पर यह टूटा जाएगा। अल्पकालिक संदर्भ चक्र बनाना वास्तव में फायदेमंद हो सकता है क्योंकि यह सुनिश्चित करता है कि कॉल के जीवन के लिए लक्ष्य मौजूद है। चक्र स्वाभाविक रूप से एक समस्या नहीं हैं। अटूट चक्र समस्याएं हैं।

दो कारण हैं कि इससे कोई चक्र नहीं बनता है। सबसे पहले, कोई "चक्र" नहीं है। सिस्टम कुछ (एक सेकंड में उस पर अधिक) संदर्भित करने जा रहा है, निश्चित रूप से। लेकिन "उस चीज़ का संदर्भ कहां है जो कुछ संदर्भित कर रहा है?" यह थोड़ा और स्पष्ट रूप से कहने के लिए, भले ही एनीमेशन सिस्टम self का संदर्भ देता है, एनीमेशन सिस्टम का संदर्भ देने वाले self कैसा है? कोई चक्र नहीं है।

अन्य कारणों का कोई चक्र नहीं है कि आप एनीमेशन सिस्टम में self पास नहीं कर रहे हैं। आपका पासिंग self.view.layoutIfNeeded। स्विफ्ट में, यह समतुल्य है:

UIView.layoutIfNeeded(self.view) 

आप यहां self पास नहीं कर रहे हैं। आप एक दृश्य पारित कर रहे हैं। अब एनीमेशन सिस्टम लगभग निश्चित रूप से एनीमेशन पूर्ण होने तक उस दृश्य का संदर्भ रखेगा, लेकिन यह ठीक है। यह अभी भी एक चक्र नहीं है।

+1

ग्रेट स्पष्टीकरण, धन्यवाद – Chris

1

वहाँ self के बाद से कोई संदर्भ चक्र बंद पर कब्जा नहीं करता है, लेकिन आप नहीं चाहते हैं, तो यह है कि self के लिए एक और मजबूत संदर्भ है आप रैपिंग बंद करने का उपयोग कर सकते हैं।

यदि आप सुनिश्चित हैं कि self अगले 0.3 सेकंड में डिलीकेट नहीं किया गया है तो आप unowned अन्यथा weak का उपयोग कर सकते हैं। (मैं यह सुनिश्चित करने के लिए weak का उपयोग करता हूं यह सुनिश्चित करने के लिए कि यह क्रैश नहीं होता है)

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