2011-12-09 9 views
6

मुझे कुछ समय के लिए समस्या से फंस गया है और मैं जानना चाहता हूं कि कोई मदद कर सकता है या नहीं। मैं एक मुख्य नेविगेशन नियंत्रक और यूआईएममेज का उपयोग करके एक आईओएस ऐप (आईपैड) विकसित कर रहा हूं। थोड़ी देर के लिए एप्लिकेशन का उपयोग करने के बाद, ऐप को कम मेमोरी (किसी विशेष दृश्य में नहीं) के लिए मार दिया जाता है लेकिन आईपैड लॉग की जांच करके, मुझे हमेशा कम मेमोरी चेतावनी नहीं दिखाई देती है (कभी-कभी मैं करता हूं, कभी-कभी मैं नहीं करता) । यहां तक ​​कि जब मैं एक प्राप्त है, यह सिर्फ "कम स्मृति चेतावनी प्राप्त" है, लेकिन मैं कभी नहीं मिल "स्तर 1" या "स्तर 2"।आईओएस ऐप कम मेमोरी के लिए मारे गए लेकिन मेमोरी चेतावनी

एक्सकोड से लीक उपकरण का उपयोग करके, मुझे कोई लीक नहीं मिल सका।

क्या कोई मदद कर सकता है?

+0

क्या आप शायद कहीं भी एक विशाल आवंटन का अनुरोध कर रहे हैं? –

+0

मैंने इस बारे में सोचा लेकिन वास्तव में नहीं ... =/ – user1089658

+0

यदि मैं अपने दृश्य नियंत्रकों के पास एक अलग क्रम में जाता हूं, तो यह वही चीज़ कहीं और करेगा। – user1089658

उत्तर

9

एक स्मृति चेतावनी अधिसूचना के रूप में भेजी जाती है, इसलिए इसे एक अवसर के रूप में प्रेषण के लिए रनलोप पर कतारबद्ध किया जाएगा। यदि आप एक (जानबूझ कर टूट) की तरह पाश लिखने के लिए थे, तो:

while(1) 
{ 
    NSString *newString = [NSString string]; 
} 

फिर अंत में अपने अनुप्रयोग मारा जाएगा कम स्मृति के कारण है, लेकिन कोई अवसर पर यह एक ऐसी स्थिति एक कम स्मृति चेतावनी प्राप्त करने के लिए किया जाएगा।

यदि आपको चेतावनी प्राप्त किए बिना कम स्मृति के कारण मार दिया जा रहा है तो संभवतः आप कहीं अपने लिए स्मृति बाधा उत्पन्न कर रहे हैं, शायद आपके पास कुछ प्रकार का लूप है जो ऑटोरेलीज पूल में बहुत सी चीजें छोड़ देता है - तो , यदि आप लूप के माध्यम से सभी तरह से मिलता है तो अस्थायी वस्तुएं गायब हो जाती हैं और इसलिए कोई दीर्घकालिक पदचिह्न नहीं होता है, लेकिन वे लूप में रहते समय हर समय जमा हो जाते हैं।

उस तरह की स्थिति से बचने के लिए आप अपने NSAutoreleasePool एस में लूप के घोंसले के आंतरिक हिस्सों को घोंसले देखना चाहते हैं। उदाहरण के लिए, यह लूप:

while(1) 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    NSString *newString = [NSString string]; 
    [pool drain]; // stylistically preferred to release, but equivalent 
        // in reference counted environments 
} 

हमेशा के लिए जारी रहेगा लेकिन कभी भी कम स्मृति स्थिति को ट्रिगर नहीं करेगा।

+0

कम स्मृति पर मरने वाले लूप को पहचानने के तरीके पर कोई सुझाव? ... मैं एक बड़े ऐप पर काम कर रहा हूं जिसमें इस समस्या है (कोई याद नहीं है - बस दुर्घटनाग्रस्त हो) और इसमें बहुत सारे स्थान हैं जहां इसकी बहुत सारी मेमोरी का उपयोग किया जा रहा है। यह बताना आसान नहीं है कि कौन सा ऐप्पल आवंटन से अपनी सभी छवि/सीजी/कैलियर प्रतिपादन छुपाता है - और ऐप में कई सारे लूप हैं। स्वचालित रूप से/सक्रिय रूप से उन्हें कम करने पर कोई सुझाव, ऐप में NSAutoReleasePools को डालने से कम? – Adam

5

तुम भी, एप्पल के Xcode विकास के वातावरण स्मृति रिसाव का पता लगाने के लिए एक उपकरण प्रदान करते हैं स्मृति रिसाव के लिए कोशिश कर सकते हैं, इसे चलाने के लिए सबसे आसान तरीका से सीधे है

Xcode: 1. उत्पाद -> 2.Start साथ प्रदर्शन उपकरण (प्रोफाइलर) -> 3. उपकरण से लीक का चयन करें।

मेमोरी लीक का पता लगाने में आसान लगता है, और इसे समझना आसान है।

संबंधित मुद्दे