IOS5 में मजबूत और कमजोर भंडारण की व्याख्या


114

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

मैंने प्रलेखन पढ़ा : एआरसी में संक्रमण - यह आईओएस 4 को बनाए रखने, असाइन करने और जारी करने की शर्तों का संदर्भ देता है; जो मुझे भ्रमित करता है फिर मैं ओपन यू CS193p में देखता हूं, जहां यह मजबूत और कमजोर है:

सबल : "जब तक मैं इसे इंगित नहीं करता, तब तक इसे ढेर में रखें"
कमजोर : " इसे तब तक रखें जब तक कोई और इसे इंगित करता है"

दो समान नहीं हैं = यदि सूचक अब किसी वस्तु की ओर इशारा नहीं करता है, तो ऑब्जेक्ट को पकड़े हुए मेमोरी को मुक्त करें? मैं संकेत की अवधारणा, हीप, आवंटन या स्मृति की अव्यवस्था को समझता हूं - लेकिन मजबूत और कमजोर के बीच अंतर क्या है?


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

जवाबों:


509

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

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

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

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

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

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


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

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

14
+1 उत्कृष्ट उदाहरण। यह लिलेज़ को कैसे बनाए / जारी रखता है, इस पर हिलेगास के उदाहरण का एक व्युत्पन्न है, लेकिन मैं इस अनुकूलन को मजबूत / कमजोर के लिए पसंद करता हूं।
डेव डोंगलांग

2
@DaveDeLong: खैर, वे ARC के साथ 10.6 पर अवैध हैं । आप उनका उपयोग बिल्कुल नहीं कर सकते। इसलिए यह एक अप्रासंगिक बिंदु है।
बीजे होमर

5
एक और अच्छा है हीलियम गुब्बारे: जब तक कम से कम एक तार आयोजित किया जाता है, यह दूर नहीं जा रहा है। पट्टा / गुब्बारा एनालॉग भी लोगों को यह भूल जाने में अच्छा लगता है कि "स्वामित्व" का प्रबंधन रिटेन / रिलीज द्वारा किया जाता है।
स्टीव वेलर

34

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

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

निम्नलिखित को धयान मे रखते हुए:

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

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

strongObject = nil;

फिर यदि आप उन नियमों से गुजरते हैं जो आप उल्लिखित करते हैं तो आप खुद से ये प्रश्न पूछेंगे:

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

    strongObject<some_object>किसी भी अधिक को इंगित नहीं करता है । इसलिए हमें इसे रखने की आवश्यकता नहीं है।

  2. कमजोर: "इसे तब तक रखें जब तक कोई और इसे दृढ़ता से इंगित करता है"

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

इसका नतीजा यह है कि <some_object>इसे हटा दिया जाता है और यदि आपका रनटाइम इसका समर्थन करता है (लायन और आईओएस 5 ऊपर की ओर) तो weakObjectस्वचालित रूप से सेट हो जाएगा nil

अब विचार करें कि यदि हम ऐसा weakObjectकरना nilचाहते हैं तो क्या होता है:

weakObject = nil;

फिर यदि आप उन नियमों से गुजरते हैं जो आप उल्लिखित करते हैं तो आप खुद से ये प्रश्न पूछेंगे:

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

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

  2. कमजोर: "इसे तब तक रखें जब तक कोई और इसे दृढ़ता से इंगित करता है"

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

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

[ध्यान दें कि जो कुछ भी ग्रहण कर रहा <some_object>है वह किसी अन्य मजबूत संदर्भ द्वारा इंगित नहीं किया जाता है / कहीं और "आयोजित" होने के कुछ अन्य साधन।


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

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

मुझे लगता है कि आप "strongObjectPointer" जैसे शब्द का उपयोग "strongObject" के बजाय कर सकते हैं। इसलिए नए लोगों के लिए प्रोग्रामिंग का बेहतर अर्थ होगा। @BJ होमर पद Mr.Matt.Interesting पर :) अच्छा पकड़
Vijay-Apple-Dev.blogspot.com

2

बलवान

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

कमज़ोर

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

यह यहाँ ध्यान देने योग्य बात है कि आमतौर पर चक्र क्या है। हमारे पास दो ऑब्जेक्ट हैं: ऑब्जेक्ट ए और ऑब्जेक्ट बी। ऑब्जेक्ट ए में ऑब्जेक्ट बी का एक मजबूत संदर्भ है और ऑब्जेक्ट बी में ऑब्जेक्ट ए का एक मजबूत संदर्भ है। ऑब्जेक्ट ए या बी के लिए कुछ और मजबूत संदर्भ नहीं है
बोरो

2

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


1

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


1

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

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

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

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

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

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

इस विषय की विस्तारित परीक्षा के लिए मैं आपको अनुपयोगी हर्ब सटर का उल्लेख करता हूं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.