विकिपीडिया कहता है "कंप्यूटर प्रोग्रामिंग में, एक कमजोर संदर्भ एक संदर्भ है जो संदर्भित ऑब्जेक्ट को कचरा कलेक्टर द्वारा संग्रह से सुरक्षित नहीं करता है"। कोड के उन दो प्रकार के संदर्भ कैसा दिखते हैं? क्या एक कमजोर संदर्भ एक ऑटोरेलेज्ड संदेश द्वारा किया गया संदर्भ है?कमजोर और मजबूत संदर्भ उद्देश्य-सी में कैसे दिखते हैं?
उत्तर
निम्न उत्तर उस मामले के लिए है जब कोई कचरा संग्रह नहीं है (जैसे आईओएस पर)। कचरा संग्रह के मामले में, वास्तव में एक कमजोर संदर्भ बनाने के लिए एक कीवर्ड (__weak
) है।
एक "कमजोर" संदर्भ एक संदर्भ है जिसे आप बनाए नहीं रखते हैं।
आपको चक्रों को तोड़ने के लिए इन कमजोर संदर्भों का उपयोग करने की आवश्यकता है। एक आम मामला एक बच्चा वस्तु है जिसे इसके मूल वस्तु के संदर्भ की आवश्यकता होती है। इस परिदृश्य में, माता-पिता बच्चे के ऑब्जेक्ट का संदर्भ बनाए रखेंगे, और बच्चे के ऑब्जेक्ट के माता-पिता का संदर्भ होगा, लेकिन इसे बनाए रखा नहीं है। यह काम करता है क्योंकि बच्चे ऑब्जेक्ट केवल तब तक अस्तित्व में होना चाहिए जब तक कि मूल वस्तु न हो।
क्या एक कमजोर संदर्भ एक ऑटोरेलेज्ड संदेश द्वारा संदर्भित एक संदर्भ है?
नहीं वास्तव में, कि एक "बहुत कमजोर संदर्भ" ;-)
ऑटो जारी किया गया सामान (उदाहरण के लिए हर घटना पाश के अंत में) गायब हो जाता है जब कॉल स्टैक खुला हुआ है किया जाएगा। यदि आपको कम अस्थायी होने की आवश्यकता है, तो आपको एक संदर्भ बनाए रखना होगा (या उपर्युक्त मामले में यह सुनिश्चित करना चाहिए कि कुछ अन्य भाग इसे पर्याप्त रूप से बनाए रखे)।
एक कमजोर संदर्भ एक संदर्भ है जो किसी वस्तु को स्मृति में रहने के लिए मजबूर करने के लिए पर्याप्त मजबूत नहीं है, जबकि एक मजबूत संदर्भ किसी ऑब्जेक्ट को स्मृति में रहने के लिए मजबूर करता है।
यदि आपने किसी भी चर के लिए कमजोर संदर्भ बनाया है, तो आप इसके लिए शून्य प्राप्त कर सकते हैं।
UITableViewDelegate
, UIScrollViewDelegate
, आदि कमजोर संदर्भों के उदाहरण हैं।
मजबूत संदर्भ का उदाहरण: यदि आप तो obj1
भी निकल जाते हैं स्मृति से obj2
हटाने obj1
को मजबूत संदर्भ
MyClass *obj1 = [[Myclass alloc] init];
Myclass *obj2 = obj1;
यहाँ obj2
है मतलब है।
क्या obj2 वास्तव में obj1 के लिए एक मजबूत संदर्भ है? आप कहते हैं "एक कमजोर संदर्भ एक ऐसा संदर्भ है जो किसी ऑब्जेक्ट को स्मृति में रहने के लिए मजबूर करने के लिए पर्याप्त मजबूत नहीं है", और आपके उदाहरण को देखते हुए, ओबीजे 1 को रिलीज संदेश भेजना ओबीजे 1 को स्मृति में बनाए रखने से नहीं रोकेगा क्योंकि " Myclass * obj2 = obj1; " असाइनमेंट obj1 पर गिनती बनाए रखने में वृद्धि नहीं करता है। आईएमएचओ यह एक कमजोर संदर्भ है। – Centurion
क्या आप कृपया मुझे मजबूत संदर्भ समझा सकते हैं ?? – Hitesh
मुझे लगता है, एक दूसरा बयान "[obj2 retain];" यह एक मजबूत संदर्भ बना देगा। हां, ओबीजे 2 ओबीजे 1 के लिए सिर्फ एक सूचक है और दोनों 2 बनाए रखने की गणना स्मृति में आवंटित वही ऑब्जेक्ट से संबंधित है और आईएमएचओ कहीं भी एक स्थान पर संग्रहीत है।लेकिन प्रत्येक +1 को बरकरार रखने के लिए एक मालिक (कम से कम सैद्धांतिक) होता है और मेरे लिए उस मालिक के बारे में सोचने के लिए बेहतर होता है जैसे कि var/ivar/property जिसे स्पष्ट (बनाए रखने) या निहित (आवंटित) को लक्षित करने के लिए उपयोग किया गया था वस्तु। – Centurion
मैं ज्यादातर आईओएस एसडीके के बारे में चिंतित हूं। आईओएस 4 के बारे में: तो, सभी "असाइन प्रकार" गुणों और एक ओबीजे पॉइंटर के किसी अन्य सरल असाइनमेंट को बिना किसी स्पष्ट बनाए रखने वाले संदेश को कमजोर संदर्भ के रूप में माना जाना चाहिए? – Centurion
हां। लेकिन ध्यान दें कि "आवंटन" जैसी विधियों में एक अंतर्निहित "बनाए रखना" शामिल है। – Thilo
@Thillo यदि हम गुणों का उपयोग कर रहे हैं, तो 'कमजोर' 'असाइन' के समान है? –