调用didReceiveMemoryWarning时向用户生成警报

时间:2010-01-02 20:44:58

标签: iphone objective-c ios-simulator

我看到一些应用程序在检测到内存不足时会生成警告。我尝试在我的应用程序中执行此操作但遇到了问题。使用模拟器来模拟内存警告,生成的警报会弹出两次,然后我才能点击“确定”并在最后一次消失之前再次弹出9次。

调用didReceiveMemoryWarning时生成警报是一个坏主意吗?

如果没有,有没有比我下面更好的方法呢?

- (void)didReceiveMemoryWarning {

     [super didReceiveMemoryWarning];

     // Release any cached data, images, etc that aren't in use.
     ...

     UIAlertView *alert = [[UIAlertView alloc]
                          initWithTitle:@"Warning" 
                          message:@"Your device is low on memory..." 
                          delegate:nil 
                          cancelButtonTitle:@"OK" 
                          otherButtonTitles:nil];
    [alert show];
    [alert release];    
}

谢谢,

菲尔

3 个答案:

答案 0 :(得分:12)

一般来说,您不应该通知用户内存不足。毕竟,他们能做什么?您的应用程序是前台应用程序,除了Apple应用程序之外,它正在消耗设备的大部分内存。用户在看到内存消息时要做什么?

当您收到内存不足通知时,您应该专注于释放内存,而无需用户交互。

答案 1 :(得分:0)

获取内存警告是一个严重的问题,任何开发移动应用程序的开发人员都不能忽视这一点。您应该始终释放占用类的didReceiveMemoryWarning方法中大部分内存的变量。

没有使用向用户显示此应用消耗大量内存的警报,因为它没有任何业务,他们可以做什么。相反,你应该专注于如何在没有用户交互的情况下减少内存消耗。以下是减少应用程序内存消耗的方法

  1. 在UI元素可见时分配它们。不要隐藏它们,而是将它们从superView中删除,并在使用时再次分配它们。
  2. 发生低内存压力时清空所有缓存。
  3. 尽可能限制变量的范围。所有类型的@property(强,保留,复制)将保持活动状态,直到您的控制器被解除分配。
  4. 使用静态分析器查找潜在泄漏的位置。
  5. 使用“可用仪器”中的“泄漏”工具查找并删除泄漏。请参阅“仪器用户指南”中的Finding Leaks in your App
  6. 使用分配工具检查应用程序的哪个部分占用大量内存。
  7. 如果您使用的是Core Foundation课程?确保使用CFRelease手动释放每个分配。
  8. 确保您不会一次创建太多自动释放对象。如果您正在创建,则通过创建自己的AutoreleasePool来缩小范围 使用@autoreleasepool声明

答案 2 :(得分:-1)

据我了解,您可能会在应用崩溃(或被杀)之前得到此信息。如果你设法释放内存,应用程序可能会存活(但不保证)。

可能有一些合法用例。由于它通常是崩溃的前奏,您可能想要警告用户这一点。这可能采取以下消息的形式:“您的设备内存不足。因此,此应用程序可能会意外退出。如果问题仍然存在,请尝试关闭电话并重新打开”。假设一切都很好,这不应该出现 - 所以你可能需要一些警告。

这可能在越狱手机上更常见,其中流行的“背景”应用程序允许应用程序在后台运行(通常直到这种情况发生 - 此时它们被强行退出 - 请参阅评论{{3例如)。

要解决连续11次触发事件的问题..您可以对弹出窗口进行速率限制。例如:显示时,存储自纪元以来的秒数。然后 - 检查一段时间后再次显示它。