2014-10-24 56 views
20

एप्पल के Swift Programming Language Guide उल्लेख कब्जा विनिर्देशकunowned(safe) और unowned(unsafe), weak और unowned के अलावा।स्विफ्ट में 'अज्ञात (सुरक्षित)' और 'अज्ञात (असुरक्षित)' के बीच क्या अंतर है?

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


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

उत्तर

22

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

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

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

में लिखे गए कोड को पुल करना है, तो आप कोको कक्षाओं के लिए आयात रैपर को देखते समय unowned(unsafe) देखेंगे, लेकिन इसका उपयोग तब तक नहीं करें आपको करना होगा, और आपको पता चलेगा कि आपको कब करना है।


अद्यतन

__unsafe_unretained एक सरल सूचक है। यह नहीं पता होगा कि जिस घटना पर ध्यान दिया जा रहा है उसे हटा दिया गया है, इसलिए जब इसे संदर्भित किया जाता है, तो अंतर्निहित स्मृति कचरा हो सकती है।

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

Transitioning to ARC Release Notes

__unsafe_unretained एक संदर्भ है कि संदर्भित वस्तु को जीवित रखने के नहीं है और नहीं के बराबर करने के लिए सेट नहीं है जब वहाँ वस्तु के लिए कोई मजबूत संदर्भ हैं निर्दिष्ट करता है। यदि ऑब्जेक्ट का संदर्भ अस्वीकार कर दिया गया है, तो पॉइंटर लटक रहा है।

+1

लेकिन उन ऑब्जेक्टिव-सी समकक्ष क्या मतलब है? – orome

+11

तो संक्षेप में, 'मजबूत' संदर्भों के विपरीत, 'कमजोर' और सभी 'अज्ञात' संदर्भ गणना में योगदान नहीं देते हैं। तो एक बार सभी 'मजबूत' संदर्भ समाप्त हो जाने के बाद, संदर्भित संदर्भ को हटा दिया जाएगा (जब केवल 'कमजोर' और 'अज्ञात' संदर्भ इसके लिए बने रहेंगे); 'कमजोर' संदर्भ 'शून्य' पर सेट किए जाएंगे (इस प्रकार उनके पास वैकल्पिक प्रकार होगा), जबकि 'अज्ञात' नहीं होगा। हालांकि 'बिना स्वामित्व वाले (सुरक्षित)' संदर्भ उदाहरणों पुनः आवंटित की जाती है, जबकि 'बिना स्वामित्व वाले (असुरक्षित)' संदर्भ एक साधारण वर्ष सूचक की तरह काम करते हैं और अप्रत्याशित व्यवहार करेगा, जब तक पहुँचा एक उम्मीद के मुताबिक अपवाद फेंक देते हैं। सही? – orome

+0

हां, यह एक अच्छा सारांश है। –

11

यहाँ Apple Developer Forums से एक उद्धरण है:

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

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

0

एक साधारण परिभाषा। जो भ्रम को दूर करेगा।

- बिना स्वामित्व वाले गुण: आपको लगता है कि यह पुनः आवंटित की जाती है को संदर्भित करता उदाहरण के बाद एक बिना स्वामित्व वाले संदर्भ तक पहुँचने का प्रयास करते हैं, तो अपने कार्यक्रम दुर्घटना होगा।

- अनजान (असुरक्षित) विशेषताएं: यदि आप उस उदाहरण के बाद एक असुरक्षित अप्रत्याशित संदर्भ तक पहुंचने का प्रयास करते हैं, जिसे संदर्भित किया जाता है, तो आपका प्रोग्राम स्मृति स्थान तक पहुंचने का प्रयास करेगा जहां उदाहरण होता था, जो एक होता है असुरक्षित ऑपरेशन। (इस मौसम में कोई गारंटी नहीं निष्पादित करता है या दुर्घटनाओं) जब यह विशेषता के साथ पहले से ही dellocated था

0

चर पहुँचा जा सकता है:

बिना स्वामित्व वाले

  • कार्यक्रम जानता है कि यह अवैध है, और दुर्घटना के तुरंत चला जाता है।
  • व्यवहार परिभाषित किया गया है।

बिना स्वामित्व वाले (असुरक्षित)

  • कार्यक्रम में कुछ नहीं जानता।
  • यह तुरंत क्रैश हो सकता है।
  • यह अज्ञात स्मृति पते का उपयोग और जब तक यह यह आश्चर्य स्थान पर मर जाता है अजीब राज्य हो सकता है।
  • व्यवहार अपरिभाषित है। जीवन कठिन हो जाता है।
संबंधित मुद्दे