एंड्रॉइड में सिंगलटेन्स बनाम एप्लिकेशन संदर्भ?


362

इस पोस्ट को याद करते हुए सिंगलेट्स का उपयोग करने की कई समस्याओं को याद करते हुए और सिंगलटन पैटर्न का उपयोग करते हुए एंड्रॉइड एप्लिकेशन के कई उदाहरणों को देखा, मुझे आश्चर्य है कि क्या वैश्विक अनुप्रयोग राज्य के माध्यम से साझा किए गए एकल उदाहरणों के बजाय सिंगललेट्स का उपयोग करना एक अच्छा विचार है। Reference.getApplication ()) के माध्यम से।

दोनों तंत्रों के क्या फायदे / कमियां होंगी?

ईमानदार होने के लिए, मुझे इस पोस्ट में वेब एप्लिकेशन के साथ सिंगलटन पैटर्न के समान उत्तर की उम्मीद है , एक अच्छा विचार नहीं है! लेकिन Android के लिए आवेदन किया। क्या मैं सही हूँ? DalvikVM में अलग क्या है अन्यथा?

संपादित करें: मैं इसमें शामिल कई पहलुओं पर राय रखना चाहूंगा:

  • तादात्म्य
  • पुनर्प्रयोग
  • परिक्षण

जवाबों:


295

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

सिंगलेट्स परीक्षण के लिए एक दुःस्वप्न हैं और, यदि आलस्य को आरम्भिक किया जाता है, तो सूक्ष्म दुष्प्रभावों के साथ "राज्य अनिश्चितता" का परिचय देगा (जो getInstance()कि एक सीमा से दूसरी ओर कॉल करते समय अचानक सतह हो सकती है )। दृश्यता को एक अन्य समस्या के रूप में उल्लिखित किया गया है, और चूंकि एकलताएं "वैश्विक" (= यादृच्छिक) साझा स्थिति तक पहुंचती हैं, इसलिए समवर्ती अनुप्रयोगों में ठीक से सिंक्रनाइज़ नहीं होने पर सूक्ष्म कीड़े उत्पन्न हो सकते हैं।

मैं इसे एक विरोधी पैटर्न मानता हूं, यह एक बुरी वस्तु-उन्मुख शैली है जो अनिवार्य रूप से वैश्विक स्थिति बनाए रखने के लिए है।

अपने प्रश्न पर वापस आने के लिए:

यद्यपि एप्लिकेशन संदर्भ को एक सिंगलटन माना जा सकता है, यह फ्रेमवर्क-प्रबंधित है और इसमें एक अच्छी तरह से परिभाषित जीवन-चक्र , दायरा और पहुंच मार्ग है। इसलिए मेरा मानना ​​है कि अगर आपको ऐप-ग्लोबल स्टेट को प्रबंधित करने की आवश्यकता है, तो इसे यहाँ जाना चाहिए, और कहीं नहीं। किसी और चीज के लिए, पुनर्विचार करें यदि आपको वास्तव में एक सिंगलटन ऑब्जेक्ट की आवश्यकता है, या यदि आपके सिंग्लटन वर्ग को फिर से लिखने के लिए संभव है कि इसके बजाय छोटे, कम-जीवित वस्तुओं को तुरंत हाथ में लें जो कार्य करते हैं।


131
यदि आप अनुप्रयोग की सिफारिश कर रहे हैं, तो आप एकल के उपयोग की सिफारिश कर रहे हैं। ईमानदारी से, इसके आसपास कोई रास्ता नहीं है। आवेदन है एक सिंगलटन, crappier अर्थ विज्ञान के साथ। मुझे सिंगलेट्स के बारे में धार्मिक दलीलों में नहीं आना चाहिए, जिसका आपको कभी उपयोग नहीं करना चाहिए। मैं व्यावहारिक होना पसंद करता हूं - ऐसे स्थान हैं जहां वे प्रति-प्रक्रिया राज्य बनाए रखने के लिए एक अच्छा विकल्प हैं और ऐसा करके चीजों को सरल बना सकते हैं, और आप बस उन्हें गलत स्थिति में उपयोग कर सकते हैं और अपने आप को पैर में गोली मार सकते हैं।
हैकबॉड

18
यह सच है, और मैंने उल्लेख किया है कि "ऐप संदर्भ को एक सिंगलटन माना जा सकता है"। अंतर यह है कि ऐप इंस्टेंस के साथ, अपने आप को पैर में गोली मारना बहुत कठिन है, क्योंकि इसके जीवन-चक्र को रूपरेखा द्वारा नियंत्रित किया जाता है। DI फ्रेमवर्क जैसे कि Guice, Hivemind, या Spring भी सिंगलटन का उपयोग करते हैं, लेकिन यह एक कार्यान्वयन विवरण है जिसे डेवलपर को ध्यान नहीं देना चाहिए। मुझे लगता है कि यह आमतौर पर फ्रेमवर्क शब्दार्थों पर भरोसा करने के लिए सुरक्षित है, बजाय आपके अपने कोड के। हाँ, मैं मानता हूँ कि मैं करता हूँ! :-)
मथायस

93
ईमानदारी से, यह आपको अपने आप को पैर में गोली मारने से नहीं रोकता है, जितना कि एक सिंगलटन करता है। यह थोड़ा भ्रमित करने वाला है, लेकिन अनुप्रयोग का कोई जीवनचक्र नहीं है । यह तब बनाया जाता है जब आपका ऐप शुरू होता है (इसके किसी भी घटक के त्वरित होने से पहले) और उसके ऑनक्रिएट () को उस बिंदु पर बुलाया जाता है, और ... वह सब है। यह वहां बैठता है और हमेशा के लिए रहता है, जब तक कि प्रक्रिया को मार नहीं दिया जाता है। बिलकुल एक सिंगलटन की तरह। :)
हैकबॉड

30
ओह एक बात जो यह भ्रमित कर सकती है - एंड्रॉइड को प्रक्रियाओं में चलने वाले एप्लिकेशन के आसपास बहुत डिज़ाइन किया गया है, और उन प्रक्रियाओं के जीवनचक्र का प्रबंधन कर रहा है। तो एंड्रॉइड सिंग्लेटन्स उस प्रक्रिया प्रबंधन का लाभ उठाने के लिए एक बहुत ही स्वाभाविक तरीका है - यदि आप अपनी प्रक्रिया में कुछ कैश करना चाहते हैं, जब तक कि प्लेटफ़ॉर्म को किसी अन्य चीज़ के लिए प्रक्रिया की मेमोरी को पुनः प्राप्त करने की आवश्यकता नहीं होती है, उस स्थिति को एक सिंगलटन में डाल देगा।
हैकबॉड

7
ठीक है मेला। मैं केवल यह कह सकता हूं कि मैंने कभी पीछे मुड़कर नहीं देखा क्योंकि हमने स्वयं-प्रबंध एकल से दूर कदम रखा। अब हम एक हल्के डि-स्टाइल समाधान का विकल्प चुन रहे हैं, जहां हम एक फैक्ट्री सिंगलटन (रूटफैक्टरी) को रखते हैं, जो बदले में ऐप इंस्टेंस द्वारा प्रबंधित किया जाता है (यह एक प्रतिनिधि है यदि आप करेंगे)। यह सिंगलटन सामान्य निर्भरता का प्रबंधन करता है, जो सभी ऐप घटकों पर निर्भर करता है, लेकिन इंस्टेंटेशन को एक ही स्थान पर प्रबंधित किया जाता है - ऐप क्लास। उस दृष्टिकोण के साथ एक सिंगलटन रहता है, यह अनुप्रयोग वर्ग तक ही सीमित है, इसलिए कोई अन्य कोड मॉड्यूल उस "विस्तार" के बारे में नहीं जानता है।
मथियास

231

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

MySingleton.getInstance(Context c) {
    //
    // ... needing to create ...
    sInstance = new MySingleton(c.getApplicationContext());
}

मैं एप्लिकेशन पर एकलताओं को प्राथमिकता देता हूं क्योंकि यह एप्लिकेशन को अधिक व्यवस्थित और मॉड्यूलर रखने में मदद करता है - एक जगह होने के बजाय जहां ऐप में आपके सभी वैश्विक राज्य को बनाए रखने की आवश्यकता होती है, प्रत्येक अलग टुकड़ा खुद का ख्याल रख सकता है। यह भी तथ्य यह है कि Singletons lazily इनिशियलाइज़ (अनुरोध पर) करने के बजाय आपको Application.onCreate () में सभी इनिशियलाइज़ेशन अप-फ्रंट करने के मार्ग के लिए अच्छा है।

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

सरल अनुप्रयोगों के लिए भी मल्टीथ्रेडिंग एकल के साथ एक मुद्दा नहीं बनता है, क्योंकि डिजाइन के द्वारा ऐप में सभी मानक कॉलबैक प्रक्रिया के मुख्य धागे पर भेजे जाते हैं, इसलिए आपके पास बहु-थ्रेडिंग तब तक नहीं होगी जब तक कि आप इसे थ्रेड्स के माध्यम से स्पष्ट रूप से पेश नहीं करते हैं या अन्य प्रक्रियाओं के लिए एक सामग्री प्रदाता या सेवा IBinder प्रकाशित करके स्पष्ट रूप से।

बस आप जो कर रहे हैं उसके बारे में विचारशील रहें। :)


1
अगर कुछ समय बाद मैं किसी बाहरी घटना को सुनना चाहता हूँ, या किसी IBinder पर साझा करता हूँ (मुझे लगता है कि यह एक साधारण ऐप नहीं होगा) तो मुझे डबल लॉकिंग, सिंक्रोनाइज़ेशन, अस्थिर, सही जोड़ना होगा? आपके उत्तर के लिए धन्यवाद :)
म्सकोनेकर

2
किसी बाहरी घटना के लिए नहीं - BroadcastReceiver.onReceive () को मुख्य धागे पर भी कहा जाता है।
हैकबॉड

2
ठीक है। क्या आप मुझे कुछ पठन सामग्री की ओर संकेत करेंगे (मैं कोड पसंद करूंगा) जहां मैं मुख्य थ्रेडिंग तंत्र को देख सकता हूं? मुझे लगता है कि यह मेरे लिए एक बार में कई अवधारणाओं को स्पष्ट करेगा। अग्रिम में धन्यवाद।
mschonaker

2
यह मुख्य ऐप-साइड डिस्पैचिंग कोड है: android.git.kernel.org/?p=platform/frameworks/…
हैकबॉड

8
सिंगलेट्स का उपयोग करने के साथ आंतरिक रूप से कुछ भी गलत नहीं है। बस उन्हें सही ढंग से उपयोग करें, जब यह समझ में आता है। .. यकीन है, ठीक है, अच्छी तरह से कहा। एंड्रॉइड फ्रेमवर्क में वास्तव में बहुत सारे हैं, इसके लिए लोड संसाधनों और इस तरह की अन्य चीजों के प्रति-प्रक्रिया कैश को बनाए रखने के लिए। बिल्कुल जैसा आप कहें। IOS की दुनिया में आपके दोस्त, "सब कुछ एक सिंगलटन है" आईओएस में .. सिंगलटन कॉन्सेप्ट से ज्यादा फिजिकल डिवाइसेस पर कुछ भी नैचुरल नहीं हो सकता है: जीपीएस, क्लॉक, जाइरो, वगैरह-वगैरह - कंसेप्टली आप इससे ज्यादा इंजीनियर कैसे होंगे? एकल के रूप में? तो हाँ।
फेटी

22

प्रेषक: डेवलपर> संदर्भ - अनुप्रयोग

एप्लिकेशन को उप-वर्ग करने की कोई आवश्यकता नहीं है। ज्यादातर स्थिति में, स्थिर एकल एक ही कार्यक्षमता को अधिक मॉड्यूलर तरीके से प्रदान कर सकते हैं। यदि आपके सिंगलटन को एक वैश्विक संदर्भ (उदाहरण के लिए प्रसारण रिसीवर्स को पंजीकृत करना) की आवश्यकता है, तो इसे पुनः प्राप्त करने के लिए फ़ंक्शन को एक संदर्भ दिया जा सकता है जो पहली बार सिंगलटन का निर्माण करते समय Context.getApplicationContext () का उपयोग करता है।


1
और अगर आप सिंगलटन के लिए एक इंटरफ़ेस लिखते हैं, तो गेट्स नॉन-स्टैटिक को छोड़कर, आप सिंगल-डिफॉल्ट कंस्ट्रक्टर के डिफॉल्ट कंस्ट्रक्टर को प्रोडक्शन सिंगलटन को एक नॉन-डिफॉल्ट कंस्ट्रक्टर के माध्यम से इंजेक्ट कर सकते हैं, जो कि कंस्ट्रक्टर भी है जिसका आप उपयोग करते हैं। सिंगलटन-क्लास अपनी इकाई परीक्षणों में उपयोग करता है।
Android.weasel

11

अनुप्रयोग सिंगलटन के समान नहीं है। इसके कारण हैं:

  1. आवेदन की विधि (जैसे onCreate) को ui थ्रेड में कहा जाता है;
  2. सिंगलटन की विधि को किसी भी धागे में कहा जा सकता है;
  3. आवेदन के "ऑनक्रिएट" की विधि में, आप हैंडलर को तुरंत कर सकते हैं;
  4. यदि सिंगलटन को कोई नहीं-यूआई थ्रेड में निष्पादित किया जाता है, तो आप हैंडलर को तत्काल नहीं कर सकते हैं;
  5. एप्लिकेशन में एप्लिकेशन में गतिविधियों के जीवन चक्र को प्रबंधित करने की क्षमता है। इसके पास "registerActivityLifecycleCallbacks" विधि है। लेकिन एकल में क्षमता नहीं है।

1
नोट: आप किसी भी थ्रेड पर हैंडलर को इंस्टेंट कर सकते हैं। डॉक्टर से: "जब आप एक नया हैंडलर बनाते हैं, तो यह उस धागे के संदेश / संदेश की कतार से जुड़ा होता है जो इसे बना रहा है"
क्राइस्ट

1
@Christ धन्यवाद! अभी-अभी मैंने "लूपर का तंत्र" सीखा है। अगर कोड oper लूपर.परपेर () ’के बिना-यूआई थ्रेड पर तत्काल हैंडलर, तो सिस्टम त्रुटि की रिपोर्ट करेगा" java.live.RuntimeException: Can 'थ्रेड के अंदर हैंडलर बनाएं जिसे Looper.prepare () नहीं कहा गया है।
सुहांग

11

मुझे एक ही समस्या थी: सिंगलटन या एक उपवर्ग android.os.Application करें?

पहले मैंने सिंगलटन के साथ प्रयास किया लेकिन कुछ बिंदु पर मेरा ऐप ब्राउज़र को कॉल करता है

Intent myIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com"));

और समस्या यह है कि, यदि हैंडसेट में पर्याप्त मेमोरी नहीं है, तो आपकी अधिकांश कक्षाएं (यहां तक ​​कि सिंगलेट्स) को कुछ मेमोरी प्राप्त करने के लिए साफ किया जाता है, इसलिए जब ब्राउज़र से मेरे ऐप पर वापस आ रहा है, तो यह हर बार क्रैश हो गया।

समाधान: आवेदन वर्ग के एक उपवर्ग के अंदर आवश्यक डेटा डालें।


1
मैं अक्सर उन पोस्टों में आया था जहाँ लोग कहते हैं कि ऐसा हो सकता है। इसलिए मैं बस वस्तुओं को संलग्न करता हूं जैसे कि सिंगललेट्स के साथ आलसी लोडिंग आदि। बस यह सुनिश्चित करने के लिए कि जीवनचक्र प्रलेखित और ज्ञात है। बस अपने एप्लिकेशन ऑब्जेक्ट में सैकड़ों छवियों को नहीं सहेजना सुनिश्चित करें क्योंकि मैं समझता हूं कि यह मेमोरी से क्लियर नहीं होगा यदि आपका ऐप पृष्ठभूमि में है और अन्य प्रक्रियाओं के लिए मेमोरी को मुक्त करने के लिए सभी गतिविधियां नष्ट हो जाती हैं।
Janusz

खैर, एप्लीकेशन रिस्टार्ट होने के बाद सिंगलटन लोडिंग लोड करना, जीसी द्वारा वस्तुओं को बहने देने का सही तरीका नहीं है। कमजोरियां सही हैं?
mschonaker

15
वास्तव में? Dalvik कक्षाएं और कार्यक्रम राज्य खो देता है? क्या आपको यकीन है कि यह कचरा-संग्रह सीमित-जीवनचक्र गतिविधि-संबंधित वस्तुओं के प्रकार नहीं है, जिन्हें आपको पहली बार एकल में नहीं डाला जाना चाहिए? आपको इस तरह के एक असाधारण दावे के लिए क्लार के उदाहरण देने होंगे!
Android.weasel

1
जब तक ऐसे बदलाव नहीं होते हैं जिनसे मैं अनभिज्ञ हूँ, दलविक वर्गों को उतारना नहीं है । कभी। जो व्यवहार वे देख रहे हैं वह उनकी प्रक्रिया है जिसे ब्राउज़र के लिए जगह बनाने के लिए पृष्ठभूमि में मार दिया जा रहा है। वे शायद अपनी "मुख्य" गतिविधि में चर को शुरू कर रहे थे, जो कि ब्राउज़र से वापस आने पर नई प्रक्रिया में नहीं बनाया गया हो सकता है।
ग्रॉक्सक्स

5

एक ही समय में दोनों पर विचार करें:

  • कक्षाओं के भीतर स्थिर उदाहरण के रूप में सिंगलटन ऑब्जेक्ट्स होना।
  • एक सामान्य वर्ग (Context) होना जो आपके आवेदन में सभी सिंगलटन ऑब्जेक्ट्स के लिए सिंगलटन इंस्टेंस देता है, जिसका यह फायदा है कि Context में विधि के नाम उदाहरण के लिए सार्थक होंगे: संदर्भ.getLoggedinUser () User.getInstance () के बजाय।

इसके अलावा, मेरा सुझाव है कि आप न केवल एकल वस्तुओं तक पहुंच को शामिल करने के लिए अपने संदर्भ का विस्तार करें, बल्कि कुछ कार्यात्मकताएं जिन्हें वैश्विक स्तर पर एक्सेस करने की आवश्यकता है, उदाहरण के लिए: Reference.logOffUser (), reference.readSavedData (), आदि। संभवतः प्रसंग का नाम बदलना। मुखौटा तब समझ में आता है।


4

वे वास्तव में एक ही हैं। एक अंतर है जो मैं देख सकता हूं। एप्लिकेशन वर्ग के साथ आप Application.onCreate () में अपने चर को इनिशियलाइज़ कर सकते हैं और Application.onTerminate () में उन्हें नष्ट कर सकते हैं। सिंगलटन के साथ आपको वीएम को प्रारंभिक और स्टैटिस्टिक को नष्ट करने पर भरोसा करना होगा।


16
डॉक्स के लिए onTerminate का कहना है कि यह केवल एमुलेटर द्वारा बुलाया जाता है। उन उपकरणों पर जिन्हें विधि नहीं कहा जाएगा। डेवलपर
.android.com

3

मेरे 2 सेंट:

मैंने देखा कि जब मेरी गतिविधि नष्ट हो गई थी, तो कुछ सिंगलटन / स्टैटिक फ़ील्ड्स को रीसेट कर दिया गया था। मैंने इसे कुछ कम अंत वाले 2.3 उपकरणों पर देखा।

मेरा मामला बहुत आसान था: मेरे पास एक निजी "इनिट_डोन" और एक स्थिर तरीका "इनिट" है जिसे मैंने गतिविधि से बुलाया है। क्रिएट ()। मुझे लगता है कि विधि फिर से निष्पादित कर रहा था गतिविधि के कुछ फिर से निर्माण पर।

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

मैंने एप्लिकेशन के एक उप वर्ग में सिंगलटन के अपने उदाहरण को स्थानांतरित किया। मैं उन्हें आवेदन उदाहरण से आरोपित करता हूं। और, तब से, समस्या को फिर से नोटिस नहीं किया।

मुझे उम्मीद है कि यह किसी की मदद कर सकता है।


3

लौकिक घोड़े के मुँह से ...

अपना ऐप विकसित करते समय, आपको अपने ऐप में विश्व स्तर पर डेटा, संदर्भ या सेवाओं को साझा करना आवश्यक हो सकता है। उदाहरण के लिए, यदि आपके ऐप में सत्र डेटा है, जैसे कि वर्तमान में लॉग-इन उपयोगकर्ता, तो आप संभवतः इस जानकारी को उजागर करना चाहेंगे। एंड्रॉइड में, इस समस्या को हल करने के लिए पैटर्न आपके android.app.Application उदाहरण के लिए सभी वैश्विक डेटा है, और फिर विभिन्न डेटा और सेवाओं के लिए स्थिर accessors के साथ एक सिंगलटन के रूप में अपने अनुप्रयोग उदाहरण का इलाज।

एंड्रॉइड ऐप लिखते समय, आपको Android.app.Application वर्ग के केवल एक उदाहरण की गारंटी दी जाती है, और इसलिए इसे एक सिंगलटन के रूप में व्यवहार करने के लिए सुरक्षित (और Google Android टीम द्वारा अनुशंसित) है। यही है, आप अपने एप्लिकेशन कार्यान्वयन में एक स्थिर getInstance () विधि को सुरक्षित रूप से जोड़ सकते हैं। इस तरह:

public class AndroidApplication extends Application {

    private static AndroidApplication sInstance;

    public static AndroidApplication getInstance(){
        return sInstance;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        sInstance = this;
    }
}

2

मेरी गतिविधि कॉल को समाप्त करती है () (जो इसे तुरंत समाप्त नहीं करती है, लेकिन अंततः करेगी) और Google स्ट्रीट व्यूअर को कॉल करती है। जब मैं इसे ग्रहण पर डिबग करता हूं, तो स्ट्रीट व्यूअर कहे जाने पर ऐप से मेरा कनेक्शन टूट जाता है, जिसे मैं समझता हूं कि (संपूर्ण) एप्लिकेशन बंद किया जा रहा है, माना जाता है कि यह मेमोरी को खाली कर देता है (समाप्त होने के दौरान एक भी गतिविधि इस व्यवहार का कारण नहीं होनी चाहिए) । फिर भी, मैं onSaveInstanceState () के माध्यम से एक बंडल में स्थिति को बचाने और स्टैक में अगली गतिविधि की ऑनक्रिएट () विधि में इसे पुनर्स्थापित करने में सक्षम हूं। या तो एक स्थिर सिंगलटन या सबक्लासिंग एप्लिकेशन का उपयोग करके मैं एप्लिकेशन को बंद करने और खोने की स्थिति का सामना करता हूं (जब तक कि मैं इसे एक बंडल में नहीं बचाता)। इसलिए मेरे अनुभव से वे राज्य संरक्षण के संबंध में समान हैं। मैंने देखा कि एंड्रॉइड 4.1.2 और 4.2.2 में कनेक्शन खो गया है, लेकिन 4.0.7 या 3.2.4 पर नहीं,


"मैंने देखा कि कनेक्शन एंड्रॉइड 4.1.2 और 4.2.2 में खो गया है, लेकिन 4.0.7 या 3.2.4 पर नहीं है, जो मेरी समझ से पता चलता है कि मेमोरी रिकवरी तंत्र कुछ बिंदु पर बदल गया है।" ..... मुझे लगता है कि आपके उपकरणों में समान मेमोरी उपलब्ध नहीं है, और न ही एक ही ऐप इंस्टॉल किया गया है। और इसलिए आपका निष्कर्ष शायद गलत है
क्राइस्ट

@ क्रिस: हाँ आप सही होना चाहिए। यह अजीब होगा कि स्मृति पुनर्प्राप्ति तंत्र संस्करणों के बीच बदल गया। संभवतः अलग-अलग मेमोरी उपयोग के कारण अलग-अलग व्यवहार होते हैं।
पियोवेज़न
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.