2010-05-06 61 views
23

我知道我可以通過從iPhone模擬器的下拉菜單中選擇'Simulate Memory Warning'來模擬模擬器上的內存警告。我甚至可以爲此製作一個熱鍵。模擬代碼中的內存警告,可能嗎?

但這不是我想達到的。我希望通過簡單的代碼來實現這一點,可以說每5秒做一次。那可能嗎?

回答

55

這實際上很簡單,但它依賴於未公開的api調用,所以不要將應用程序與它一起發佈(即使它位於不可訪問的代碼路徑中)。所有你需要做的是:[[UIApplication sharedApplication] _performMemoryWarning];

這種方法將有應用程序的UIApplication對象發佈UIApplicationDidReceiveMemoryWarningNotification並調用applicationDidReceiveMEmoryWarning:在App委託方法和所有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。很好的答案。 – 2010-05-06 23:24:56

+0

可悲的是,這不適用於我4.2,respondsToSelector條件解析爲真,選擇器執行,但沒有任何反應。 – Shizam 2011-03-07 01:59:54

+0

仍然適用於我4.3(雖然我不打擾respondsToSelector)。 – smparkes 2011-06-28 00:29:53

1

只是alloc-init循環中的大對象,並且從不釋放它們。這應該會很快觸發記憶警告,我想可以。

+1

是的,這是另一種解決方案,但我期待着更專業的方式做到這一點。決定這樣做的Ppl也要記住在不同的線程中分配這些對象,因此在主應用程序中執行它會簡單地終止應用程序(因爲它不會回到主循環)。 – krasnyk 2010-05-06 22:41:34

+3

只分配內存不會這樣做,你實際上必須寫入你分配的內存。我寫了一個應用程序來嘗試這個,發現在3GS上分配300MB後仍然如此。 – progrmr 2010-05-07 22:13:50

+0

你是否'初始化'alloc'對象實例?這通常涉及到寫入內存,設置屬性的默認值等。 – 2012-01-11 07:11:22

4

發表UIApplicationDidReceiveMemoryWarningNotification通知默認通知中心:

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

這不會像在硬件 - >模擬內存警告模擬器上觸發的內存警告一樣。有什麼不同?您的代碼只會發佈通知,以便每當您收聽此通知時,您當然都會收到通知,但是在使用您的解決方案時,不會調用viewControllers等所有-didReceiveMemoryWarning方法。 – krasnyk 2011-05-18 09:22:39

+7

將無法​​正常工作。爲了正確工作,請使用[[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationDidReceiveMemoryWarningNotification object: [UIApplication sharedApplication]]; – 2011-10-05 11:43:59

5

我寫了一個蘋果腳本,將錘擊模擬器的內存錯誤,它有點極端,但如果你的c Öde倖存下來,那麼你可以更有信心...

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 2012-08-21 22:47:45

+0

真棒QA的頭腦。謝謝。 – JJacquet 2017-04-19 15:32:19