2010-05-06 5 views
23

मैं जानता हूँ कि मैं iPhone सिम्युलेटर के ड्रॉप डाउन मेनू से 'मेमोरी चेतावनी अनुकरण' को चुन कर सिम्युलेटर पर एक स्मृति चेतावनी अनुकरण कर सकते हैं। मैं इसके लिए एक गर्म कुंजी भी बना सकता हूं।कोड से स्मृति चेतावनियों को अनुकरण, संभव है?

लेकिन यह नहीं है कि मैं प्राप्त करने के लिए चाहते हैं। मैं बस कोड से ऐसा करना चाहता हूं, हर 5 सेकंड में यह कहें। क्या यह संभव है?

उत्तर

55

यह वास्तव में बहुत आसान है, लेकिन यह एक गैर-दस्तावेजी API कॉल पर निर्भर करता है, तो यह सहायता से अपने ऐप्लिकेशन जहाज न (भले ही यह एक दुर्गम कोड रास्ते में है)। आपको बस इतना करना है: [[UIApplication sharedApplication] _performMemoryWarning];

इस विधि एप्लिकेशन की UIApplication वस्तु UIApplicationDidReceiveMemoryWarningNotification पोस्ट और फोन applicationDidReceiveMEmoryWarning होगा: अनुप्रयोग प्रतिनिधि पर विधि और डिफ़ॉल्ट करने के लिए सभी UIViewController के

-(IBAction) performFakeMemoryWarning { 
    #ifdef DEBUG_BUILD 
    SEL memoryWarningSel = @selector(_performMemoryWarning); 
    if ([[UIApplication sharedApplication] respondsToSelector:memoryWarningSel]) { 
     [[UIApplication sharedApplication] performSelector:memoryWarningSel]; 
    }else { 
     NSLog(@"Whoops UIApplication no loger responds to -_performMemoryWarning"); 
    } 
    #else 
    NSLog(@"Warning: performFakeMemoryWarning called on a non debug build"); 
    #endif 
} 
+1

+1। अच्छा उत्तर। –

+0

अफसोस की बात यह है कि यह 4.2 पर मेरे लिए काम नहीं कर रहा है, प्रतिक्रियाओं के लिए चयनकर्ता सशर्त हल करने के लिए सशर्त हल करता है और चयनकर्ता किया जाता है लेकिन कुछ भी नहीं होता है। – Shizam

+0

अभी भी 4.3 पर मेरे लिए काम करता है (हालांकि मैं जवाब देने के लिए परेशान नहीं करता हूं)। – smparkes

1
एक पाश में बस alloc-init बड़ा वस्तुओं

, और उन्हें जारी नहीं की। यह एक स्मृति चेतावनी बहुत जल्दी ट्रिगर करना चाहिए, मैं कल्पना करता हूँ।

+1

हाँ यह एक और समाधान था, लेकिन मैं इसे करने का एक और अधिक पेशेवर तरीका ढूंढ रहा हूं। पीपीएल जो इसे करने का फैसला करता है, उस तरह से उन वस्तुओं को अलग-अलग थ्रेड में आवंटित करने के लिए ध्यान में रखना पड़ता है, क्योंकि इसे मुख्य में करने से केवल एप्लिकेशन को मारना पड़ता है (क्योंकि यह मुख्य लूप पर वापस नहीं आ रहा है)। – krasnyk

+3

बस स्मृति आवंटित करने से यह नहीं होता है, आपको वास्तव में आवंटित स्मृति को लिखना होगा। मैंने कोशिश करने के लिए एक ऐप लिखा था और पाया कि 3 जीएस पर 300 एमबी आवंटित करने के बाद और यह अभी भी चल रहा था। – progrmr

+0

क्या आपने 'alloc'-ed ऑब्जेक्ट उदाहरण' init' किया था? यह आमतौर पर स्मृति के लिए लिख गुण के मूलभूत मूल्यों की स्थापना, आदि –

4

पोस्ट UIApplicationDidReceiveMemoryWarningNotification अधिसूचना सूचना केंद्र:

[[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationDidReceiveMemoryWarningNotification object:nil] 
+1

यह हार्डवेयर के साथ एक सिम्युलेटर पर स्मृति चेतावनी ट्रिगर के समान काम नहीं करेगा-> स्मृति चेतावनी अनुकरण करें। अंतर क्या है? आपका कोड केवल अधिसूचना पोस्ट करेगा ताकि जब भी आप इस अधिसूचना को सुनें, तो आपको निश्चित रूप से अधिसूचित किया जाएगा, लेकिन उन सभी -DidReceiveMemory चेतावनी के तरीकों की चेतावनी विधियों को तब भी नहीं कहा जाएगा जब आपका समाधान उपयोग किया जाएगा। – krasnyk

+7

सही ढंग से काम नहीं करेगा।सही काम के लिए, [[NSNotificationCenter defaultCenter] postNotificationName का उपयोग करें: UIApplicationDidReceiveMemoryWarningNotification ऑब्जेक्ट: [UIAplplication sharedAplication]]; –

5

मैं एक सेब स्क्रिप्ट स्मृति त्रुटियों के साथ सिम्युलेटर हथौड़ा जाएगा लिखा था, यह थोड़ा चरम है लेकिन यदि आपके ग ode जीवित रहता है, तो आप अधिक आत्मविश्वास हो सकते हैं ...

on run 
repeat 100 times 
    tell application "System Events" 
     tell process "iOS Simulator" 
      tell menu bar 1 
       tell menu bar item "Hardware" 
        tell menu "Hardware" 
         click menu item "Simulate Memory Warning" 
        end tell 
       end tell 
      end tell 
     end tell 
    end tell 
    delay 0.5 
end repeat 
end run 
+0

कूल, मुझे यह पसंद है – LolaRun

+0

एक असली क्यूए दिमाग बहुत बढ़िया है। धन्यवाद। – JJacquet

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