दोनों weak
और unowned
संदर्भ strong
संदर्भित ऑब्जेक्ट पर पकड़ नहीं बनाते हैं (उक्त वस्तु को एआरसी को संदर्भित ऑब्जेक्ट को रोकने से रोकने के लिए बनाए रखने की संख्या में वृद्धि नहीं करते हैं)।
लेकिन दो कीवर्ड क्यों? इस अंतर को इस तथ्य के साथ करना है कि Optional
प्रकार स्विफ्ट भाषा में निर्मित हैं। उनके बारे में लंबी कहानी: वैकल्पिक प्रकार स्मृति सुरक्षा प्रदान करते हैं (यह स्विफ्ट के निर्माता नियमों के साथ खूबसूरती से काम करता है - जो इस लाभ को प्रदान करने के लिए सख्त हैं)।
एक weak
संदर्भ इसके बनने की संभावना को अनुमति देता है nil
(यह स्वचालित रूप से तब होता है जब संदर्भित वस्तु को हटा दिया जाता है), इसलिए आपकी संपत्ति का प्रकार वैकल्पिक होना चाहिए - इसलिए, एक प्रोग्रामर के रूप में, आप इसे उपयोग करने से पहले इसे जांचने के लिए बाध्य हैं (मूल रूप से इसका उपयोग करने से पहले) संकलक आपको सुरक्षित कोड लिखने के लिए जितना संभव हो उतना मजबूर करता है)।
एक unowned
संदर्भ यह मानता है कि यह nil
अपने जीवनकाल के दौरान कभी नहीं बनेगा । एक प्रसिद्ध संदर्भ आरंभीकरण के दौरान निर्धारित किया जाना चाहिए - इसका मतलब है कि संदर्भ को एक गैर-वैकल्पिक प्रकार के रूप में परिभाषित किया जाएगा जिसे बिना जांच के सुरक्षित रूप से उपयोग किया जा सकता है। अगर किसी तरह संदर्भित की जा रही वस्तु को हटा दिया जाता है, तो जब अज्ञात संदर्भ का उपयोग किया जाएगा, तो ऐप क्रैश हो जाएगा।
से एप्पल डॉक्स :
कमजोर संदर्भ का उपयोग करें जब भी यह उस संदर्भ के लिए मान्य हो, तो अपने जीवनकाल में किसी बिंदु पर शून्य हो जाए। इसके विपरीत, एक अज्ञात संदर्भ का उपयोग करें जब आप जानते हैं कि संदर्भ कभी भी शून्य नहीं होगा क्योंकि इसे आरंभीकरण के दौरान सेट किया गया है।
डॉक्स में, कुछ उदाहरण हैं जो चर्चा करते हैं कि चक्र को बनाए रखा जाए और उन्हें कैसे तोड़ा जाए। ये सभी उदाहरण डॉक्स से निकाले गए हैं ।
weak
कीवर्ड का उदाहरण :
class Person {
let name: String
init(name: String) { self.name = name }
var apartment: Apartment?
}
class Apartment {
let number: Int
init(number: Int) { self.number = number }
weak var tenant: Person?
}
और अब, कुछ ASCII कला के लिए (आपको डॉक्स को देखना चाहिए - उनके पास बहुत आरेख हैं):
Person ===(strong)==> Apartment
Person <==(weak)===== Apartment
Person
और Apartment
उदाहरण के लिए एक स्थिति है जहाँ दो गुण, जो दोनों के शून्य होने की अनुमति दी जाती है, एक मजबूत संदर्भ चक्र पैदा करने के लिए क्षमता है पता चलता है। यह परिदृश्य एक कमजोर संदर्भ के साथ सबसे अच्छा हल है। दोनों संस्थाएं एक दूसरे पर सख्त निर्भरता के बिना मौजूद हो सकती हैं।
unowned
कीवर्ड का उदाहरण :
class Customer {
let name: String
var card: CreditCard?
init(name: String) { self.name = name }
}
class CreditCard {
let number: UInt64
unowned let customer: Customer
init(number: UInt64, customer: Customer) { self.number = number; self.customer = customer }
}
इस उदाहरण में, एक Customer
या नहीं हो सकता है CreditCard
, लेकिन एक CreditCard
हमेशा एक के साथ जुड़ा रहेगाCustomer
। इसका प्रतिनिधित्व करने के लिए, Customer
वर्ग में एक वैकल्पिक card
संपत्ति होती है, लेकिन CreditCard
कक्षा में एक गैर-वैकल्पिक (और गैर-सूचीबद्ध) customer
संपत्ति होती है।
Customer ===(strong)==> CreditCard
Customer <==(unowned)== CreditCard
Customer
और CreditCard
उदाहरण के लिए एक स्थिति है जहाँ एक संपत्ति है कि नहीं के बराबर होने की अनुमति दी है और एक अन्य संपत्ति है कि नहीं के बराबर नहीं हो सकता एक मजबूत संदर्भ चक्र पैदा करने के लिए क्षमता है पता चलता है। यह परिदृश्य एक अज्ञात संदर्भ के साथ सबसे अच्छा हल है।
एप्पल से नोट:
कमजोर संदर्भों को चर के रूप में घोषित किया जाना चाहिए, यह इंगित करने के लिए कि उनका मूल्य रनटाइम में बदल सकता है। एक कमजोर संदर्भ को एक स्थिर के रूप में घोषित नहीं किया जा सकता है।
एक तीसरा परिदृश्य भी है जब दोनों गुणों का हमेशा एक मूल्य होना चाहिए, और न तो संपत्ति को कभी भी शून्य होना चाहिए जब एक बार आरंभीकरण पूरा हो जाता है।
और क्लोजर के साथ काम करने से बचने के लिए क्लासिक रिटेन साइकिल परिदृश्य भी हैं।
इसके लिए, मैं आपको Apple डॉक्स पर जाने या पुस्तक पढ़ने के लिए प्रोत्साहित करता हूं ।