iOS विकास: मैं डिवाइस पर कम मेमोरी चेतावनी कैसे प्रेरित कर सकता हूं?


91

मैं अपने ऐप फ़ंक्शंस को कम मेमोरी स्थितियों में अच्छी तरह से परीक्षण करना चाहता हूं, लेकिन परीक्षण करना मुश्किल है। जब ऐप डिवाइस पर चल रहा हो, तो सिम्युलेटर नहीं, मैं कम मेमोरी चेतावनियों को कैसे प्रेरित कर सकता हूं, जो डिराइव्मेमोरीवेरिंग विधि को ट्रिगर करता है? या मैं इन संभावित परिस्थितियों में अपने ऐप का परीक्षण करने के कुछ तरीके क्या कर सकता हूं?

मेरे द्वारा सिम्युलेटर का उपयोग नहीं करने का कारण मेरा ऐप गेम सेंटर है और यह आमंत्रित करता है कि सिम्युलेटर पर काम न करें।

जवाबों:


8

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

आप एक अलग ऐप बनाना भी चुन सकते हैं जो कुछ ऐसा ही करता है और इसे पृष्ठभूमि में चलाने के लिए डिज़ाइन किया गया है, यदि आप इसे आसानी से पुन: उपयोग करना चाहते हैं और / या कई अनुप्रयोगों के साथ परीक्षण कर सकते हैं।


7
बहुत व्यावहारिक नहीं है। परीक्षण के लिए एक निजी विधि को कॉल करने का उपाय बेहतर है
डेयज-जोन

4
यदि आप वास्तविक विश्व परिदृश्य को देखना चाहते हैं तो एक अच्छा समाधान नहीं है। आप मेमोरी प्रेशर के कारण लीक न होने के कारण ऐप को अपंग कर रहे हैं। यह बुरा है क्योंकि आप जो करना चाहते हैं वह परीक्षण करता है कि ऐप उच्च स्मृति दबाव स्थिति में कैसे प्रतिक्रिया करता है। नकारात्मक पक्ष यह पता लगाने के लिए कि समस्या एक वास्तविक रिसाव है या नकली जिसे आपने पेश किया है। नीचे दिए गए परीक्षण के लिए निजी विधि एक बेहतर है।
फ़ैज़िज़

2
इस उत्तर को कम नहीं किया जाना चाहिए, क्योंकि दूसरा पैराग्राफ वास्तव में एप्पल का कहना है कि यदि आप अपने ऐप के व्यवहार का परीक्षण करना चाहते हैं तो मेमोरी वास्तव में कम हो जाती है।
मैट

1
इस आवंटन को करने के लिए कोड ब्लॉक के साथ उत्तर को बेहतर बनाया जाएगा!
21

यद्यपि इसे सेटअप करने में अधिक काम लगता है, यह निजी पद्धति को कॉल करने की तुलना में अधिक यथार्थवादी परीक्षण है। जब वास्तव में महत्वपूर्ण स्मृति दबाव होता है, तो क्या आपका ऐप उन कार्यों को करने में सक्षम होगा जो आप इसे करने के लिए कहते हैं? और क्या वे क्रियाएं स्थिति को राहत देती हैं या इसे बदतर बनाती हैं और iOS को इसे समाप्त करने का कारण बनती हैं? इसके अलावा, DISPATCH_SOURCE_TYPE_MEMORYPRESSURE के परीक्षण के लिए निजी पद्धति काम नहीं करती है।
jk7 17

278

आप निजी विधि को कॉल कर सकते हैं :

[[UIApplication sharedApplication] performSelector:@selector(_performMemoryWarning)];

केवल डिबग पर इसका उपयोग करने के लिए याद रखें, अन्यथा आपका ऐप अस्वीकृत हो जाएगा।


6
ऐसा प्रतीत होता है कि यह कोड डिवाइस पर मेमोरी चेतावनी को सटीक रूप से अंकित करता है। धन्यवाद Enzo!
विलियम डेनिस

28
कोड में इसका उपयोग करने के बजाय, इसे डीबगर में निष्पादित करें। बस विराम दें और प्रवेश करेंpo [[UIApplication sharedApplication]performSelector:@selector(_performMemoryWarning)]
orkoden

17
Po का उपयोग करने के बजाय, expr का उपयोग करें, अर्थातexpr (void)[[UIApplication sharedApplication] performSelector:@selector(_performMemoryWarning)];
एंडी

11
डीबगर में, आपको हेडर नहीं होने के लिए वर्कअराउंड का उपयोग करने की आवश्यकता नहीं है:expr (void)[[UIApplication sharedApplication] _performMemoryWarning]
OrangeDog

3
किसी के लिए भी जो स्विफ्ट के साथ ऐसा करना expr UIApplication.sharedApplication().performSelector("_performMemoryWarning")#selector
चाह

27

IOS सिम्युलेटर का Simulate Memory Warningमेनू आइटम आपको मेमोरी चेतावनी का अनुकरण करने की अनुमति देता है।


डिवाइस पर इसे जांचने का एकमात्र तरीका वास्तव में इसे लागू करना है, अर्थात लंबे समय तक ऐप का उपयोग करके या गहन चित्र या आपके पास क्या है, ऐप के लिए अलग-अलग होगा। एक सुझाव पुराने iPhone (शायद 3 जी?) के बजाय एक iPhone 4 का उपयोग करने के लिए हो सकता है ताकि आपको तेज़ी से चेतावनी देने में मदद मिल सके।
जेसी नौगैर

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

10
प्रश्न डिवाइस पर सिमुलेशन के बारे में था।
केपीएम

20

इंस्ट्रूमेंट्स का उपयोग करते हुए, मेन्यू आइटम का उपयोग करें: इंस्ट्रूमेंट -> मेमोरी वार्निंग को सॉल्व करें।

Xcode से अपने ऐप पर इंस्ट्रूमेंट्स का उपयोग करने के लिए, उत्पाद -> प्रोफ़ाइल मेनू आइटम का उपयोग करें।


यह और भी बेहतर है।
जैपेल

@OrangeDog क्या हो रहा है?
थॉमस डब्ल्यू

2
कुछ नहीं। जब मैं Enzo के उत्तर विचारों का उपयोग करता हूं, तो जब मैं उनके पास लौटता हूं, तो इस विधि का उपयोग नहीं करना होता है।
ऑरेंजडॉग

12

मैंने स्विफ्ट में एंज़ो ट्रान का जवाब फिर से लिखा है :

UIControl().sendAction(Selector(("_performMemoryWarning")), to: UIApplication.shared, for: nil)

धन्यवाद! एक्सकोड "ऑब्जेक्टिव-सी सिलेक्टर के साथ घोषित कोई विधि नहीं" की चेतावनी देता है, लेकिन फिर भी यह काम करता है।
man1

10

यदि कोई है, जो भी कारण के लिए, स्विफ्ट 4 में ऐसा करने की कोशिश करता है - यहां बताया गया है कि 1.2 जीबी रैम कैसे आवंटित किया जाए।

let d = Data.init(repeating: 100, count: 1200000000)
  • यह अन्य ऐप्स में चेतावनी चेतावनी को ट्रिगर करने में सहायक है

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

यह तुरंत दुर्घटनाग्रस्त हो जाता है
डैनियल स्प्रिंगर

7

एक मेनू कमांड देता है जो इसे लागू करेगा।

Hardware > Simulate Memory Warning सिम्युलेटर से।


8
प्रश्न डिवाइस पर सिमुलेशन के बारे में था।
केपीएम

2
Xcode 10 में अब यह डिबग> सिम्यूलेट मेमोरी चेतावनी के तहत है।
सेबबो

7

@ChikabuZ को स्विफ्ट 3 में परिवर्तित किया:

UIControl().sendAction(Selector(("_performMemoryWarning")), to: UIApplication.shared, for: nil)

4

यदि कोई है, जो भी कारण से, स्विफ्ट 3 में ऐसा करने की कोशिश करता है - यहां बताया गया है कि 1.2 जीबी रैम कैसे आवंटित किया जाए।

   for i in 0...1200 {
      var p: [UnsafeMutableRawPointer] = []
      var allocatedMB = 0
      p.append(malloc(1048576))
      memset(p[allocatedMB], 0, 1048576);
      allocatedMB += 1;
   }

3
d d = Data.init (दोहराएं: 100, गिनती: 1200000000)
एडोबल्स

2
@ Adobels आपको एक उत्तर के रूप में पोस्ट करना चाहिए :)
Koen।

1

स्विफ्ट 4:

UIApplication.shared.perform (चयनकर्ता (( "_ performMemoryWarning")))

किसी घटना / अधिसूचना के जवाब में उपरोक्त निष्पादित कर सकते हैं।

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