可以从代码中模拟内存警告吗?

时间:2010-05-06 22:15:58

标签: iphone memory memory-management ios-simulator

我知道我可以通过从iPhone模拟器的下拉菜单中选择“模拟内存警告”来模拟模拟器上的内存警告。我甚至可以为此做一个热门关键。

但这不是我想要实现的目标。我想通过简单的代码来做到这一点,让我们说每5秒做一次。这可能吗?

4 个答案:

答案 0 :(得分:55)

实际上它非常简单,但是它依赖于未记录的api调用,所以不要随它发送你的应用程序(即使它在一个无法访问的代码路径中)。您所要做的就是:[[UIApplication sharedApplication] _performMemoryWarning];

此方法将使App的UIApplication对象发布UIApplicationDidReceiveMemoryWarningNotification,并在App Delegate和所有UIViewController上调用applicationDidReceiveMEmoryWarning:方法

-(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 :(得分:5)

我写了一个苹果脚本会破坏模拟器的内存错误,这有点极端,但如果你的代码存活下来,那么你可以更自信......

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

答案 2 :(得分:4)

UIApplicationDidReceiveMemoryWarningNotification通知发布到默认通知中心:

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

答案 3 :(得分:1)

循环中只有alloc-init个大对象,永远不会释放它们。这应该会很快触发记忆警告,我想。