2012-02-13 19 views
110

में मजबूत और कमजोर भंडारण की व्याख्या IOS5 विकास और उद्देश्य-सी का उपयोग करने के लिए नया हूं। मुझे मजबूत और कमजोर संग्रहण के बीच अंतर को समझने में परेशानी है। मैंने प्रलेखन और अन्य SO प्रश्न पढ़े हैं, लेकिन वे सभी मेरे साथ समान अंतर्दृष्टि के समान नहीं हैं।आईओएस 5

मैंने the documentation: Transitioning To ARC पढ़ा - यह आईओएस 4 शर्तों को बनाए रखने, असाइन करने और रिलीज़ करने के संदर्भों के संदर्भ में है; जो मुझे भ्रमित करता है। तब मैं ओपन यू CS193p, जहां यह मजबूत और कमजोर differentiates पर गौर:

मजबूत: "ढेर में रखना जब तक मैं अब और इसे करने के लिए इंगित नहीं करते"
कमजोर: "रखने के इस जब तक कोई और इसे दृढ़ता से इंगित करता है "

क्या दो परिभाषा समान नहीं हैं = यदि पॉइंटर अब किसी ऑब्जेक्ट को इंगित नहीं करता है, तो ऑब्जेक्ट को रखने वाली मेमोरी को मुक्त करें? मैं पॉइंटर्स, ढेर, आवंटन या स्मृति के विलोपन की अवधारणा को समझता हूं - लेकिन मजबूत और कमजोर के बीच क्या अंतर है?

+0

मेमोरी प्रबंधन मॉडल अभी भी प्रासंगिक है भले ही आप एआरसी का उपयोग कर रहे हों। आपको अभी भी संदर्भ गिनती समझनी है, आपको बस इसे मैन्युअल रूप से करने की आवश्यकता नहीं है। तो आपका अंतिम अनुच्छेद एक अनुचित मांग है। – jrturton

उत्तर

497

अंतर यह है कि जैसे ही मजबूत पॉइंटर्स हैं, तो एक ऑब्जेक्ट को हटा दिया जाएगा। यहां तक ​​कि यदि कमजोर पॉइंटर्स इसे इंगित करते हैं, तो आखिरी मजबूत पॉइंटर खत्म होने के बाद, ऑब्जेक्ट को हटा दिया जाएगा, और शेष शेष कमजोर पॉइंटर्स शून्य हो जाएंगे।

शायद एक उदाहरण क्रम में है।

कल्पना करें कि हमारी वस्तु एक कुत्ता है, और कुत्ता भागना चाहता है (हटाया जाना चाहिए)।

मजबूत पॉइंटर्स कुत्ते पर एक पट्टा की तरह हैं। जब तक आप कुत्ते से छिड़काव करते हैं, तब तक कुत्ता भाग नहीं जाएगा। यदि पांच लोग एक कुत्ते को अपने पट्टा संलग्न करते हैं, (एक वस्तु के लिए पांच मजबूत पॉइंटर्स), तो कुत्ते तब तक भाग नहीं पाएगा जब तक कि सभी पांच लीश अलग नहीं हो जाते।

दूसरी ओर, कमजोर पॉइंटर्स कुत्ते पर इशारा करते हुए छोटे बच्चे हैं और कह रहे हैं "देखो! एक कुत्ता!" जब तक कुत्ता अभी भी पट्टा पर है, छोटे बच्चे अभी भी कुत्ते को देख सकते हैं, और वे अभी भी इसे इंगित करेंगे। जैसे ही सभी लीश अलग हो जाते हैं, हालांकि, कुत्ता दूर चला जाता है इससे कोई फर्क नहीं पड़ता कि कितने छोटे बच्चे इसे इंगित कर रहे हैं।

जैसे ही अंतिम मजबूत सूचक (पट्टा) अब किसी ऑब्जेक्ट को इंगित नहीं करता है, ऑब्जेक्ट को हटा दिया जाएगा, और सभी कमजोर पॉइंटर्स को शून्य कर दिया जाएगा।

+3

अच्छा। Hillegass? – jrturton

+1

यह ऐप्पल में एक समानता मैल्कॉम क्रॉफर्ड के आधार पर कुछ साल पहले दिया गया था। पता नहीं वह कहाँ मिला। –

+0

मुझे एक किताब में कुछ समान (पूर्व-आर्क) पढ़ना याद है, लगता है कि यह हिलेगैस था, लेकिन फिर वह इसे कहीं और से प्राप्त कर सकता था ... हालांकि यह एक अच्छा है! – jrturton

1

नहीं, वे समान नहीं हैं लेकिन बहुत अलग हैं। यदि आप ऑब्जेक्ट को बनाए रखने की आवश्यकता रखते हैं तो आप केवल तभी मजबूत उपयोग करते हैं। आप किसी अन्य मामले पर कमजोर का उपयोग करते हैं, लाभ के साथ कि आप जान सकते हैं कि वस्तु को ढेर से हटा दिया गया है क्योंकि कोई भी इसे बनाए रखता है।

34

दो परिभाषा समान नहीं हैं।

बिलकुल नहीं। आपके द्वारा इंगित की गई दो परिभाषाओं में महत्वपूर्ण अंतर "जब तक कोई और" है। यह "कोई और" है जो महत्वपूर्ण है।

निम्नलिखित पर विचार करें:

__strong id strongObject = <some_object>; 
__weak id weakObject = strongObject; 

अब हम <some_object>, एक मजबूत और एक कमजोर करने के लिए एक दो संकेत मिल गया है।अगर हम तो जैसे nil करने के लिए strongObject सेट:

strongObject = nil; 

तब यदि आप नियमों का आप तो उल्लिखित के माध्यम से जाना तुम अपने आप को इन सवालों को पूछने होगी:

  1. मजबूत: "जब तक ढेर में रखना मैं अब इसे इंगित नहीं करता "

    strongObject<some_object> पर इंगित नहीं करता है। तो हमें इसे रखने की जरूरत नहीं है।

  2. कमजोर: "इस रूप में लंबे समय किसी और अंक के रूप में यह करने के लिए दृढ़ता से रखने के"

    weakObject अभी भी <some_object> को इंगित करता है। लेकिन चूंकि कोई भी अन्य इंगित करता है, इसलिए इस नियम का भी अर्थ है कि हमें इसे रखने की आवश्यकता नहीं है।

नतीजा यह है कि <some_object> deallocated है और अपने क्रम इसका समर्थन करता है, तो (शेर तथा iOS 5 ऊपर की तरफ) तो weakObject स्वचालित रूप से nil करने के लिए सेट हो जाएगा।

अब विचार करें क्या हुआ अगर हम इतनी तरह nil को weakObject सेट होता है:

weakObject = nil; 

तब यदि आप नियमों का आप तो उल्लिखित के माध्यम से जाना तुम अपने आप को इन सवालों को पूछने होगी:

  1. मजबूत : "इसे तब तक रखें जब तक कि मैं इसे इंगित न करूं"

    strongObject<some_object> पर इंगित करता है। तो हमें इसे रखने की जरूरत है।

  2. कमजोर: "इस रूप में लंबे समय किसी और अंक के रूप में यह करने के लिए दृढ़ता से रखने के"

    weakObject<some_object> को इंगित नहीं करता है।

नतीजा यह है कि <some_object>नहीं पुनः आवंटित की जाती है, लेकिन weakObjectnil सूचक होगा।

[ध्यान दें कि सभी कि यह सोचते है <some_object> कहीं और एक और मजबूत संदर्भ द्वारा की ओर इशारा नहीं कर रहा है/"रखे हुए" होने की कुछ अन्य साधनों]

+1

तो मजबूत और कमजोर के बीच मुख्य अंतर यह है कि ऑब्जेक्ट्स को निरंतर ध्यान में रखते हुए सभी संबंधित कमजोर पॉइंटर्स को स्वचालित रूप से हटा दिया जाएगा। और किसी कमजोर सूचक के लिए कुछ इंगित करने के लिए, हमेशा एक मजबूत सूचक मौजूद होता है। यदि हां, तो मुख्य अनुप्रयोग वस्तु को दृढ़ता से इंगित किया जाना चाहिए? – KMC

+0

किसी कमजोर सूचक के लिए कुछ * मान्य * इंगित करने के लिए, तो हाँ एक मजबूत सूचक होना चाहिए। उस तथ्य को जोड़ें कि आईओएस 5 और शेर कमजोर संदर्भों के ऑटो-एनलिंग का समर्थन करते हैं और आप जो कहते हैं उसे प्राप्त करते हैं। आईओएस 4 का रनटाइम * नहीं * समर्थन करता है हालांकि। "मुख्य अनुप्रयोग ऑब्जेक्ट" मुझे लगता है कि आप 'यूआईएप्लिकेशन' ऑब्जेक्ट का मतलब है? इसे 'UIKit' के आंतरिक कार्यप्रणाली द्वारा दृढ़ता से संदर्भित किया जाएगा - लेकिन आपको इसके बारे में चिंता करने की आवश्यकता नहीं है। – mattjgalloway

+0

मुझे लगता है कि आप "strongObject" के बजाय "strongObjectPointer" जैसे शब्द का उपयोग कर सकते हैं। तो प्रोग्रामिंग के लिए नए लोगों का बेहतर अर्थ होगा। @ बीजे होमर पोस्ट पर अच्छा पकड़ श्रीमती। रुचि :) –

2

मजबूत

  1. स्वामित्व संपत्ति और सौंपा मूल्य के बीच बनाता है ।
  2. यह एआरसी में ऑब्जेक्ट प्रॉपर्टी के लिए डिफ़ॉल्ट है, इसलिए यह आपको संदर्भ गणना के बारे में चिंता करने और संदर्भ को स्वचालित रूप से रिलीज़ करने की अनुमति नहीं देता है।
  3. यह बनाए रखने के लिए प्रतिस्थापन है। अगर हम बनाए रखने के रूप में उपयोग करने की आवश्यकता है तो हम केवल तभी उपयोग करते हैं।

कमजोर

  1. बनाता संपत्ति और सौंपा मूल्य के बीच गैर-स्वामित्व।
  2. पैरेंट ऑब्जेक्ट पर स्ट्रॉन्ग का उपयोग किया जाता है और जब माता-पिता को रिहा किया जाता है तो बच्चे के ऑब्जेक्ट पर कमजोर होता है तो बाल ऑब्जेक्ट संदर्भ भी
  3. पर सेट किया जाता है, यह चक्र बनाए रखने से रोकने में मदद करता है।
  4. कचरा कलेक्टर द्वारा संग्रहित होने पर यह संदर्भित वस्तु की रक्षा नहीं करता है।
  5. कमजोर अनिवार्य रूप से असाइन किया गया है, संपत्ति को अनदेखा कर दिया गया है।
+0

यह उल्लेख करने लायक है कि आमतौर पर बनाए रखने वाला चक्र क्या होता है। हमारे पास दो ऑब्जेक्ट्स हैं: ऑब्जेक्ट ए और ऑब्जेक्ट बी ऑब्जेक्ट ए के पास ऑब्जेक्ट बी का एक मजबूत संदर्भ है और ऑब्जेक्ट बी का ऑब्जेक्ट ए का एक मजबूत संदर्भ है। किसी और के पास ऑ या बी ऑब्जेक्ट का कोई मजबूत संदर्भ नहीं है। – boro

2

एक और उदाहरण: छात्र एक Object, माना जाता है कि वह/वे आगे बढ़ सकते हैं (deallocate) के रूप में लंबे समय के रूप वह/वे सभी कोर-पाठ्यक्रम (strong pointers), कोई बात नहीं समाप्त हो गया है, तो वह/वे वैकल्पिक-पाठ्यक्रम लेना है (weak pointers)। दूसरे शब्दों में: मजबूत सूचक केवल Object के विलोपन का एकमात्र कारक है।

1

मुझे पता है कि मैं इस पार्टी के लिए बहुत देर हो चुकी हूं, लेकिन मुझे लगता है कि "मजबूत और कमजोर स्मृति मॉडल" का अर्थ इस बात पर निर्भर करता है कि आप सॉफ़्टवेयर या हार्डवेयर के बारे में बात कर रहे हैं या नहीं।

हार्डवेयर के लिए, कमजोर या मजबूत इंगित करता है कि अनुक्रमिक स्थिरता के लिए समर्थन है या नहीं।

[अनुसूचित जाति का मतलब है कि] ... किसी भी निष्पादन का परिणाम एक ही है के रूप में अगर सब के संचालन प्रोसेसर कुछ अनुक्रमिक क्रम में फांसी दे दी गई है, और प्रत्येक व्यक्ति के प्रोसेसर के संचालन इस क्रम में दिखाई देते हैं अपने प्रोग्राम द्वारा निर्दिष्ट आदेश में। - Lamport, 1979

डब्ल्यूटीएफ को स्मृति के साथ क्या करना है? इसका तात्पर्य है कि विभिन्न प्रोसेसर द्वारा चर के लिए लिखना सभी प्रोसेसर द्वारा उसी क्रम में देखा जाना चाहिए। एक मजबूत मॉडल के साथ हार्डवेयर में यह गारंटी है। एक कमजोर मॉडल के साथ हार्डवेयर पर, यह नहीं है।

मौजूदा उत्तर केवल सॉफ्टवेयर मेमोरी मॉडल के संदर्भ में प्रश्न की व्याख्या करते हैं। हार्डवेयर प्रोग्रामिंग के लिए अप्रासंगिक नहीं है। यह सवाल आईओएस का उल्लेख करता है, जो आम तौर पर आर्म 7 प्रोसेसर पर चलता है। आर्म 7 में एक कमजोर स्मृति मॉडल है। एक मजबूत मॉडल के साथ प्रोसेसर के आदी प्रोग्रामर के लिए - जो हम सभी हैं क्योंकि x86 और x64 का एक मजबूत मॉडल है - यह एक भयानक जाल है। एक मजबूत मॉडल में ठीक काम करने के लिए बाहर निकलने के लिए एक और थ्रेड सिग्नल करने के लिए एक बूल का उपयोग करना। आर्म पर एक ही कोड तब तक काम नहीं करता जब तक कि आप ध्वज को अस्थिर चिह्नित न करें, और फिर भी यह अनियमित है।

हालांकि यह सच है कि Arm8 + अधिग्रहण/रिलीज के लिए स्पष्ट समर्थन के साथ पूरी तरह से इसे बदलता है, विरासत सॉफ्टवेयर इस समर्थन का उपयोग नहीं करता है। लीगेसी सॉफ़्टवेयर में सभी तीन फोन ओएस और उन सभी चीजें शामिल हैं जो उनके साथ चलती हैं, साथ ही संकलक और पुस्तकालयों को अपडेट किए जाने तक भी शामिल किया जाता है।

इस विषय की एक विस्तृत परीक्षा के लिए मैं आपको Herb Sutter अक्षम करने के लिए संदर्भित करता हूं।