memory management - स्विफ्ट में 'अनोखा(सुरक्षित)' और 'अनूठा(असुरक्षित)' के बीच अंतर क्या है?




memory-management swift (2)

ऐप्पल की स्विफ्ट प्रोग्रामिंग भाषा गाइड में कैप्चर विनिर्देशकों को unowned(safe) और unowned(unsafe) का उल्लेख है, weak और unowned अलावा

मैं (लगता है कि मैं) weak और unowned बीच के अंतरों को समझता हूं; लेकिन unowned(safe) और unowned(unsafe) बीच अंतर क्या है? गाइड नहीं कहता है।

कृपया: केवल उद्देश्य-सी समकक्ष बताते हुए भरोसा मत करो


जो मैं समझता हूं, हालांकि मुझे ऐप्पल से एक निश्चित स्रोत नहीं मिल सकता है, unowned दो जायके, safe और unsafe

एक बेवकूफ़ अनावृत unowned(safe) : यह विशेष रूप से लिपटे संदर्भ है, जो एक अपवाद को फेंक देगा जब एक dealloced उदाहरण का संदर्भ दिया जाएगा।

विशेष मामला unowned(unsafe) : यह उद्देश्य सी की @property (assign) __unsafe_unretained @property (assign) या __unsafe_unretained के स्विफ्ट समकक्ष है। यह स्विफ्ट प्रोग्राम में उपयोग नहीं किया जाना चाहिए, क्योंकि इसका उद्देश्य उद्देश्य सी में लिखे गए कोड को पुल करना है।

तो, आपको कोका वर्गों के लिए आयात आवरण को देखते हुए, unowned(unsafe) दिखाई देगा, लेकिन इसका उपयोग तब तक न करें जब तक आपको नहीं करना पड़ता है, और आपको पता चल जाएगा कि आपके पास कब है

अद्यतन करें

__unsafe_unretained एक साधारण सूचक है जब यह इंगित किया जा रहा है कि यह dealloced किया गया है, तो यह नहीं पता होगा, इसलिए जब यह dereferenced है, अंतर्निहित स्मृति कचरा हो सकता है

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

एआरसी रिलीज नोट्स में संक्रमण

__unsafe_unretained एक संदर्भ निर्दिष्ट करता है जो संदर्भित ऑब्जेक्ट को जीवित नहीं रखता है और जब ऑब्जेक्ट का कोई ठोस संदर्भ नहीं होता है तो वह शून्य पर सेट नहीं होता है। अगर वस्तु को उल्लिखित किया गया है, तो सूचक झूठ छोड़ दिया है।


यहां एप्पल डेवलपर फ़ोरम से एक उद्धरण है:

unowned बनाम unowned(safe) बनाम unowned(unsafe)

unowned(safe) एक गैर-मालिकाना संदर्भ है जो पहुंच पर जोर देती है कि वस्तु अभी भी जीवित है यह एक कमजोर वैकल्पिक संदर्भ की तरह है जो x! साथ अनवरत रूप से अपठित है x! हर बार इसे एक्सेस किया जाता है unowned(unsafe) एआरसी में __unsafe_unretained की तरह है - यह एक गैर-मालिकाना संदर्भ है, लेकिन कोई भी रन टाइम चेक नहीं है कि ऑब्जेक्ट अभी भी पहुंच पर जीवित है, इसलिए लंपट संदर्भ कचरा मेमोरी में पहुंच जाएंगे। unowned हमेशा unowned(safe) लिए एक पर्याय है, परन्तु इसका इरादा है कि यह -Ofast unowned(unsafe) लिए अनुकूलित किया -Ofast जब रन-टाइम चेक निष्क्रिय हो जाए







automatic-ref-counting