एक कमजोर संदर्भ और एक अज्ञात संदर्भ के बीच अंतर क्या है?


240

स्विफ्ट में है:

  • मजबूत संदर्भ
  • कमजोर संदर्भ
  • प्रख्यात संदर्भ

एक अज्ञात संदर्भ एक कमजोर संदर्भ से कैसे अलग है?

एक अज्ञात संदर्भ का उपयोग करना कब सुरक्षित है?

प्रख्यात संदर्भ C / C ++ में बिंदुओं को झूलने जैसा सुरक्षा जोखिम है?



मेरा अनुभव unownedउन कक्षाओं के लिए उपयोग करना है जिन्हें हम नियंत्रित करते हैं, Apple कक्षाओं के लिए, उपयोग करें weakक्योंकि हम यह सुनिश्चित करने के लिए गारंटी नहीं दे सकते कि यह क्या करता है
onmyway133

@NoorAli, या "स्वामित्व" के रूप में "अज्ञात" संदर्भ अक्सर मालिक को इंगित करता है।
इयान रिंगरोज

जवाबों:


361

दोनों weakऔर unownedसंदर्भ strongसंदर्भित ऑब्जेक्ट पर पकड़ नहीं बनाते हैं (उक्त वस्तु को एआरसी को संदर्भित ऑब्जेक्ट को रोकने से रोकने के लिए बनाए रखने की संख्या में वृद्धि नहीं करते हैं)।

लेकिन दो कीवर्ड क्यों? इस अंतर को इस तथ्य के साथ करना है कि Optionalप्रकार स्विफ्ट भाषा में निर्मित हैं। उनके बारे में लंबी कहानी: वैकल्पिक प्रकार स्मृति सुरक्षा प्रदान करते हैं (यह स्विफ्ट के निर्माता नियमों के साथ खूबसूरती से काम करता है - जो इस लाभ को प्रदान करने के लिए सख्त हैं)।

एक weakसंदर्भ इसके बनने की संभावना को अनुमति देता है nil(यह स्वचालित रूप से तब होता है जब संदर्भित वस्तु को हटा दिया जाता है), इसलिए आपकी संपत्ति का प्रकार वैकल्पिक होना चाहिए - इसलिए, एक प्रोग्रामर के रूप में, आप इसे उपयोग करने से पहले इसे जांचने के लिए बाध्य हैं (मूल रूप से इसका उपयोग करने से पहले) संकलक आपको सुरक्षित कोड लिखने के लिए जितना संभव हो उतना मजबूर करता है)।

एक unownedसंदर्भ यह मानता है कि यह nilअपने जीवनकाल के दौरान कभी नहीं बनेगा । एक प्रसिद्ध संदर्भ आरंभीकरण के दौरान निर्धारित किया जाना चाहिए - इसका मतलब है कि संदर्भ को एक गैर-वैकल्पिक प्रकार के रूप में परिभाषित किया जाएगा जिसे बिना जांच के सुरक्षित रूप से उपयोग किया जा सकता है। अगर किसी तरह संदर्भित की जा रही वस्तु को हटा दिया जाता है, तो जब अज्ञात संदर्भ का उपयोग किया जाएगा, तो ऐप क्रैश हो जाएगा।

से एप्पल डॉक्स :

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

डॉक्स में, कुछ उदाहरण हैं जो चर्चा करते हैं कि चक्र को बनाए रखा जाए और उन्हें कैसे तोड़ा जाए। ये सभी उदाहरण डॉक्स से निकाले गए हैं ।

weakकीवर्ड का उदाहरण :

class Person {
    let name: String
    init(name: String) { self.name = name }
    var apartment: Apartment?
}

class Apartment {
    let number: Int
    init(number: Int) { self.number = number }
    weak var tenant: Person?
}

और अब, कुछ ASCII कला के लिए (आपको डॉक्स को देखना चाहिए - उनके पास बहुत आरेख हैं):

Person ===(strong)==> Apartment
Person <==(weak)===== Apartment

Personऔर Apartmentउदाहरण के लिए एक स्थिति है जहाँ दो गुण, जो दोनों के शून्य होने की अनुमति दी जाती है, एक मजबूत संदर्भ चक्र पैदा करने के लिए क्षमता है पता चलता है। यह परिदृश्य एक कमजोर संदर्भ के साथ सबसे अच्छा हल है। दोनों संस्थाएं एक दूसरे पर सख्त निर्भरता के बिना मौजूद हो सकती हैं।

unownedकीवर्ड का उदाहरण :

class Customer {
    let name: String
    var card: CreditCard?
    init(name: String) { self.name = name }
}

class CreditCard {
    let number: UInt64
    unowned let customer: Customer
    init(number: UInt64, customer: Customer) { self.number = number; self.customer = customer }
}

इस उदाहरण में, एक Customerया नहीं हो सकता है CreditCard, लेकिन एक CreditCard हमेशा एक के साथ जुड़ा रहेगाCustomer । इसका प्रतिनिधित्व करने के लिए, Customerवर्ग में एक वैकल्पिक cardसंपत्ति होती है, लेकिन CreditCardकक्षा में एक गैर-वैकल्पिक (और गैर-सूचीबद्ध) customerसंपत्ति होती है।

Customer ===(strong)==> CreditCard
Customer <==(unowned)== CreditCard

Customerऔर CreditCardउदाहरण के लिए एक स्थिति है जहाँ एक संपत्ति है कि नहीं के बराबर होने की अनुमति दी है और एक अन्य संपत्ति है कि नहीं के बराबर नहीं हो सकता एक मजबूत संदर्भ चक्र पैदा करने के लिए क्षमता है पता चलता है। यह परिदृश्य एक अज्ञात संदर्भ के साथ सबसे अच्छा हल है।

एप्पल से नोट:

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

एक तीसरा परिदृश्य भी है जब दोनों गुणों का हमेशा एक मूल्य होना चाहिए, और न तो संपत्ति को कभी भी शून्य होना चाहिए जब एक बार आरंभीकरण पूरा हो जाता है।

और क्लोजर के साथ काम करने से बचने के लिए क्लासिक रिटेन साइकिल परिदृश्य भी हैं।

इसके लिए, मैं आपको Apple डॉक्स पर जाने या पुस्तक पढ़ने के लिए प्रोत्साहित करता हूं ।


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

वर्ग व्यक्ति {नाम बताएं: स्ट्रिंग init (नाम: स्ट्रिंग) {self.name = name} कमजोर var अपार्टमेंट: अपार्टमेंट? } क्लास अपार्टमेंट {लेट नंबर: इंट इनिट (नंबर: इंट) {सेल्फ.नंबर = नंबर} कमजोर वर् टेनेंट: पर्सन? }
जस्टिन लेवी विंटर

3
weak var Person?बनाम क्या अंतर है var Person??
डीन

4
@JustinLevi, यदि आप दोनों संपत्तियों को कमजोर घोषित करते हैं, तो उनके निस्तारण की संभावना है। व्यक्ति अपार्टमेंट के लिए एक मजबूत संदर्भ रखता है इसलिए अपार्टमेंट को निपटाया नहीं जाएगा। यदि अपार्टमेंट में व्यक्ति के प्रति एक ही मजबूत संदर्भ होगा, तो वे एक बनाए रखने के चक्र को बनाएंगे - जिसे प्रोग्रामर द्वारा रनटाइम पर तोड़ा जा सकता है यदि वह इसके बारे में जानता है, लेकिन अन्यथा यह सिर्फ एक मेमोरी लीक है। यह सब मजबूत, कमजोर और नामी: उच्च स्तर पर स्मृति प्रबंधन के बारे में उपद्रव है, क्योंकि एआरसी हमारे लिए सभी गंदे सामान करता है। चक्र बनाए रखने से बचना हमारा काम है।
इलिया क्रिस्टियन

1
क्या कमजोर से अधिक प्रसिद्ध का एकमात्र लाभ यह है कि आपको अनचेक करने की आवश्यकता नहीं है और एक निरंतर उपयोग कर सकते हैं? क्या कोई उदाहरण है जहां आप कमजोर का उपयोग नहीं कर सकते हैं और केवल अनजाने का उपयोग कर सकते हैं?
एलन

29

Q1। एक "संदर्भ" कैसे "कमजोर संदर्भ" से अलग है?

कमजोर संदर्भ:

एक कमजोर संदर्भ एक संदर्भ है जो उस उदाहरण पर एक मजबूत पकड़ नहीं रखता है जो संदर्भित करता है, और इसलिए एआरसी को संदर्भित उदाहरण के निपटान से नहीं रोकता है। क्योंकि कमजोर संदर्भों को "कोई मूल्य नहीं" देने की अनुमति है, आपको प्रत्येक कमजोर संदर्भ को वैकल्पिक प्रकार होने की घोषणा करनी चाहिए। (Apple डॉक्स)

प्रसिद्ध संदर्भ:

कमजोर संदर्भों की तरह, एक अज्ञात संदर्भ उस उदाहरण पर एक मजबूत पकड़ नहीं रखता है जिसे वह संदर्भित करता है। एक कमजोर संदर्भ के विपरीत, हालांकि, एक अज्ञात संदर्भ को हमेशा मान दिया जाता है। इस वजह से, एक अज्ञात संदर्भ को हमेशा गैर-वैकल्पिक प्रकार के रूप में परिभाषित किया जाता है। (Apple डॉक्स)

प्रत्येक का उपयोग कब करें:

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


Q2। "अज्ञात संदर्भ" का उपयोग करना कब सुरक्षित है?

जैसा कि ऊपर उद्धृत किया गया है, एक अज्ञात संदर्भ को हमेशा मान दिया जाता है। इसलिए आपको इसका उपयोग केवल तब करना चाहिए जब आप सुनिश्चित हों कि संदर्भ कभी भी शून्य नहीं होगा। Apple डॉक्स निम्नलिखित उदाहरण के माध्यम से जाने-माने संदर्भों के लिए उपयोग-मामले का वर्णन करता है।

मान लीजिए कि हमें दो वर्गों है Customerऔर CreditCard। एक ग्राहक बिना क्रेडिट कार्ड के मौजूद हो सकता है, लेकिन एक क्रेडिट कार्ड ग्राहक के बिना मौजूद नहीं होगा, यानी यह माना जा सकता है कि क्रेडिट कार्ड में हमेशा ग्राहक रहेगा। इसलिए, उन्हें निम्नलिखित संबंध रखना चाहिए:

class Customer {
    var card: CreditCard?
}

class CreditCard {
    unowned let customer: Customer
}

Q3। C / C ++ में "अनजान संदर्भ" एक सुरक्षा जोखिम है जैसे "लटकने वाले बिंदु"

मुझे ऐसा नहीं लगता।

चूंकि विख्यात संदर्भ केवल कमजोर संदर्भ हैं जो किसी मूल्य के लिए गारंटी हैं, यह किसी भी तरह से सुरक्षा जोखिम नहीं होना चाहिए। हालाँकि, यदि आप उदाहरण के बाद किसी अज्ञात संदर्भ को एक्सेस करने का प्रयास करते हैं, तो यह संदर्भित है, तो आप रनटाइम त्रुटि को ट्रिगर करेंगे, और ऐप क्रैश हो जाएगा।

यही एकमात्र जोखिम है जिसे मैं इसके साथ देखता हूं।

Apple डॉक्स से लिंक करें


आपके Q2 उदाहरण कार्यक्रम सरल को अनजाने के बारे में समझने के लिए..धन्यवाद .. क्या आप कमजोर और मजबूत के लिए एक ही प्रकार का उदाहरण जोड़ सकते हैं ..
रंजीथ कुमार

अति उत्कृष्ट। धन्यवाद।
स्विफ्टी मैकस्वीफ्टरटन

क्या आप अज्ञात या कमजोर के लिए एक सामान्य उदाहरण शामिल कर सकते हैं?
हनी

माता-पिता और बच्चे की वस्तुओं पर विचार करें, यदि बच्चा बिना माता-पिता के मौजूद नहीं हो सकता है, तो unownedबच्चे की कक्षा में माता-पिता की संपत्ति के लिए उपयोग करें । कमजोर वाइस वर्सा है। अच्छी व्याख्या @myxtic! unownedसंदर्भ केवल weakसंदर्भ हैं जो एक मूल्य होने की गारंटी हैं!
सैफ

26

यदि स्वयं को बंद उपयोग [कमजोर स्वयं] में शून्य किया जा सकता है ।

यदि स्वयं को बंद करने के उपयोग में शून्य नहीं होगा [अज्ञात स्व]

यदि यह दुर्घटनाग्रस्त हो जाता है जब आप [अज्ञात स्वयं] का उपयोग करते हैं, तो स्वयं संभवतः उस बंद में कुछ बिंदु पर शून्य होता है और आपको संभवतः इसके बजाय [कमजोर स्वयं] का उपयोग करने की आवश्यकता होती है ।

क्लोजर में मजबूत , कमजोर और गैर - कानूनी का उपयोग करने पर उदाहरण देखें :

https://developer.apple.com/library/ios/documentation/swift/conceptual/swift_programming_language/AutomaticReferenceCounting.html


7
क्यों न केवल कमजोर का उपयोग करें, भले ही आत्म शून्य हो सकता है, कोई नुकसान सही नहीं?
बून

4
hi @ बून - यह वास्तव में महत्वपूर्ण सवाल है।
फेटी

[कमजोर स्व] => अगर मैं व्यूडलड (अंदर) बंद का उपयोग करता हूं, selfतो शून्य कैसे हो सकता है?
हसन तारेक

@ हासन तारेक, मुझे लगता है कि उपरोक्त उदाहरण में कुछ अच्छे उदाहरण दिए गए हैं। "क्लोजर के लिए मजबूत संदर्भ चक्रों को हल करना" अनुभाग देखें, esp। उद्धरण: "स्विफ्ट के लिए आपको स्वयं को लिखने की आवश्यकता है। जब भी आप किसी क्लोजर के भीतर स्वयं के सदस्य को संदर्भित करते हैं, तो यह याद रखें कि यह याद रखना संभव है कि स्व द्वारा कब्जा करना संभव है। दुर्घटना। " इसके अंश: Apple Inc. "स्विफ्ट प्रोग्रामिंग लैंग्वेज (स्विफ्ट 4)।" iBooks। itunes.apple.com/de/book/the-swift-programming-language-swift-4/… "
निक एंटिन

1
@ बून यदि आप हमेशा कमजोर का उपयोग करते हैं, तो कंपाइलर उपयोग करने से पहले वैकल्पिक जांचने के लिए मजबूर करेगा। यदि आपने वह चेक नहीं डाला है, तो यह संकलन समय त्रुटि देगा। कोई और हरम नहीं है।
विकास मिश्रा

5

लिंक से अर्क

कुछ निष्कर्ष अंक

  • यह निर्धारित करने के लिए कि क्या आपको मजबूत, कमजोर या अज्ञात के बारे में चिंता करने की ज़रूरत है, पूछें, "क्या मैं संदर्भ प्रकारों के साथ काम कर रहा हूं"। यदि आप संरचना या Enums के साथ काम कर रहे हैं, तो ARC उन प्रकारों के लिए मेमोरी का प्रबंधन नहीं कर रहा है और आपको उन स्थिरांक या चर के लिए कमजोर या अज्ञात को निर्दिष्ट करने के बारे में चिंता करने की आवश्यकता नहीं है।
  • पदानुक्रमित संबंधों में मजबूत संदर्भ ठीक हैं जहां माता-पिता बच्चे का संदर्भ देते हैं, लेकिन इसके विपरीत नहीं। वास्तव में, मजबूत संदर्भ अधिकांश समय के सबसे अधिक प्रकार के संदर्भ हैं।
  • जब दो उदाहरण वैकल्पिक रूप से एक दूसरे से संबंधित होते हैं, तो सुनिश्चित करें कि उन उदाहरणों में से एक दूसरे के लिए कमजोर संदर्भ रखता है।
  • जब दो उदाहरण इस तरह से संबंधित होते हैं कि एक उदाहरण दूसरे के बिना मौजूद नहीं हो सकता है, तो अनिवार्य निर्भरता वाले उदाहरण को दूसरे उदाहरण के लिए एक अज्ञात संदर्भ रखने की आवश्यकता होती है।

1

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

यह कहा कि एक अज्ञात संदर्भ का उपयोग करना सुरक्षित है जहां आप सुनिश्चित हैं कि ऑब्जेक्ट का जीवनकाल संदर्भ से अधिक है। यदि ऐसा नहीं है, तो इसके बजाय कमजोर संदर्भ का उपयोग करना बेहतर है।

प्रश्न के तीसरे भाग के रूप में, मुझे नहीं लगता कि अज्ञात संदर्भ एक झूलने वाले सूचक के समान है। जब हम संदर्भ गणना के बारे में बात करते हैं, तो हम आमतौर पर ऑब्जेक्ट की मजबूत संदर्भ संख्या का संदर्भ देते हैं। इसी प्रकार स्विफ्ट ऑब्जेक्ट के लिए अज्ञात संदर्भ गणना और कमजोर संदर्भ मायने रखता है (कमजोर संदर्भ बिंदुओं को ऑब्जेक्ट के बजाय "साइड टेबल" कहा जाता है)। जब मजबूत संदर्भ गणना शून्य तक पहुंच जाती है, तो वस्तु विखंडित हो जाती है, लेकिन अमान्य संदर्भ गणना शून्य से अधिक होने पर इसे अस्वीकृत नहीं किया जा सकता है।

अब डैंगलिंग पॉइंटर एक ऐसी चीज़ है जो एक मेमोरी लोकेशन की ओर इशारा करती है जो पहले ही डील हो चुकी है। लेकिन स्विफ्ट में चूंकि मेमोरी को केवल तब तक ही निपटाया जा सकता है जब तक कि ऑब्जेक्ट के लिए एक अज्ञात संदर्भ है, यह एक डैंगलिंग पॉइंटर का कारण नहीं बन सकता है।

बहुत सारे लेख हैं जो स्विफ्ट मेमोरी प्रबंधन पर अधिक विस्तार से चर्चा करते हैं। यहाँ एक है।


0

विख्यात संदर्भ एक प्रकार का कमजोर संदर्भ है जिसका उपयोग दो वस्तुओं के बीच एक समान जीवनकाल के संबंध में किया जाता है, जब किसी वस्तु को केवल एक ही वस्तु के स्वामित्व में होना चाहिए। यह एक वस्तु और उसके गुणों में से एक अपरिवर्तनीय बंधन बनाने का एक तरीका है।

मध्यवर्ती स्विफ्ट WWDC वीडियो में दिए गए उदाहरण में, एक व्यक्ति क्रेडिट कार्ड का मालिक है, और एक क्रेडिट कार्ड में केवल एक धारक हो सकता है। क्रेडिट कार्ड पर, व्यक्ति को एक वैकल्पिक संपत्ति नहीं होनी चाहिए, क्योंकि आप नहीं चाहते हैं कि केवल एक मालिक के पास एक क्रेडिट कार्ड तैरता रहे। आप क्रेडिट पर एक कमजोर संदर्भ में धारक की संपत्ति बनाकर इस चक्र को तोड़ सकते हैं, लेकिन इसके लिए आपको इसे वैकल्पिक बनाने के साथ-साथ परिवर्तनीय (निरंतर के विपरीत) की आवश्यकता होती है। इस मामले में विख्यात संदर्भ का अर्थ है कि हालांकि क्रेडिटकार्ड के पास एक व्यक्ति की अपनी हिस्सेदारी नहीं है, इसका जीवन इस पर निर्भर करता है।

class Person {
    var card: CreditCard?
}

class CreditCard {

    unowned let holder: Person

    init (holder: Person) {
        self.holder = holder
    }
}

wwdc वीडियो या शीर्षक के लिए लिंक?
ओसा

-2

का प्रयोग करें unownedजब आप सुनिश्चित हैं selfकभी नहीं हो सकता nilबिंदु आप तक पहुँचने में selfउस बिंदु पर।

उदाहरण (आप निश्चित रूप से लक्ष्य को सीधे जोड़ सकते हैं MyViewController, लेकिन फिर, यह एक सरल उदाहरण है):

class MyViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        let myButton = MyButton { [unowned self] in
            print("At this point, self can NEVER be nil. You are safe to use unowned.")
            print("This is because myButton can not be referenced without/outside this instance (myViewController)")
        }
    }
}

class MyButton: UIButton {
    var clicked: (() -> ())

    init(clicked: (() -> ())) {
        self.clicked = clicked

        // We use constraints to layout the view. We don't explicitly set the frame.
        super.init(frame: .zero)

        addTarget(self, action: #selector(clicked), for: .touchUpInside)
    }

    @objc private func sendClosure() {
        clicked()
    }
}

का प्रयोग करें weakजब वहाँ एक संभावना selfहो सकती है nilबात आप तक पहुँचने में self

उदाहरण:

class MyViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        NetworkManager.sharedInstance.receivedData = { [weak self] (data) in
            print("Can you guarentee that self is always available when the network manager received data?")
            print("Nope, you can't. Network manager will be alive, regardless of this particular instance of MyViewController")
            print("You should use weak self here, since you are not sure if this instance is still alive for every")
            print("future callback of network manager")
        }
    }
}

class NetworkManager {

    static let sharedInstance = NetworkManager()

    var receivedData: ((Data) -> ())?

    private func process(_ data: Data) {
        // process the data...

        // ... eventually notify a possible listener.
        receivedData?(data)
    }
}

की विपक्ष unowned:

  • कमजोर से ज्यादा कुशल
  • आप (अच्छी तरह से, आप मजबूर हैं) उदाहरण को अपरिवर्तनीय के रूप में चिह्नित करने के लिए (स्विफ्ट 5.0 के बाद से नहीं)।
  • आपके कोड के पाठक को इंगित करता है: इस उदाहरण का X से संबंध है और यह इसके बिना नहीं रह सकता है, लेकिन यदि X चला गया है, तो मैं भी चला गया हूं।

की विपक्ष weak:

  • अज्ञात से अधिक सुरक्षित (क्योंकि यह दुर्घटना नहीं कर सकता है)।
  • एक्स के लिए एक रिश्ता बना सकते हैं जो दोनों तरीकों से जाता है, लेकिन दोनों एक दूसरे के बिना रह सकते हैं।

यदि आप निश्चित नहीं हैं, तो उपयोग करें weakरुको , मेरा मतलब है कि स्टैकऑवरफ्लो पर यहां पूछें कि आपको अपने मामले में क्या करना चाहिए! हर समय कमजोर का उपयोग करना जब आपको सिर्फ अपने और अपने कोड के पाठक के लिए भ्रमित नहीं करना चाहिए।

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