【问题标题】:Generating alert to User when didReceiveMemoryWarning is called调用 didReceiveMemoryWarning 时向用户生成警报
【发布时间】:2010-12-31 20:33:26
【问题描述】:

我看到一些应用程序在检测到内存不足时会生成警告。我试图在我的应用程序中执行此操作,但遇到了问题。使用模拟器模拟内存警告,生成的警报在我可以点击“确定”之前弹出两次,然后再弹出 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];    
}

谢谢,

菲尔

【问题讨论】:

    标签: iphone objective-c ios-simulator


    【解决方案1】:

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

    向用户显示此应用正在消耗大量内存是没有用的,因为这与他们无关,他们可以做什么。相反,您应该专注于如何在没有用户交互的情况下减少内存消耗。以下是减少应用程序内存消耗的方法

    1. 当 UI 元素可见时分配它们。不要隐藏它们,而是将它们从 superView 中移除,并在使用时重新分配。
    2. 发生低内存压力时清空所有缓存。
    3. 尽可能限制变量的范围。所有@property 类型(Strong、retain、copy)都将保持活动状态,直到您的 Controller 被释放。
    4. 使用静态分析器查找潜在泄漏位置。
    5. 使用可用仪器中的泄漏工具查找和消除泄漏。请参阅 Instruments 用户指南中的 Finding Leaks in your App
    6. 使用分配工具检查应用程序的哪个部分消耗了大量内存。
    7. 如果您使用的是核心基础类?确保您使用 CFRelease 手动释放每个分配。
    8. 确保您没有一次性创建过多的自动释放对象。如果您正在创建,则通过创建自己的 AutoreleasePool 来缩小范围 通过使用 @autoreleasepool 声明性

    【讨论】:

      【解决方案2】:

      据我了解,您可能会在您的应用程序崩溃(或被终止)之前得到这个。如果您设法释放内存,应用程序可能会继续存在(但不能保证)。

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

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

      要解决事件被连续触发 11 次的问题。您可以限制弹出窗口的速率。例如:当您显示时,存储自纪元以来的秒数。然后 - 在再次显示之前检查是否已经过了一定时间。

      【讨论】:

      • 你描述的用例是我想要完成的。我有一些手机越狱的用户写我的应用程序崩溃了。如果可用内存是问题,我想让他们知道。我按照您的建议通过将警报从每个视图控制器中的 didReceiveMemoryWarning 移动到发生速率限制的应用程序委托中的常用方法来限制警报的速率。 (我并没有意识到我收到重复警报的原因是由于在所有视图控制器中同时触发了 didReceiveMemoryWarning,直到我进行了更改。)谢谢!
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-09
        • 1970-01-01
        • 2015-07-06
        • 2023-04-05
        • 2011-06-24
        • 1970-01-01
        • 2012-07-26
        • 1970-01-01
        相关资源
        最近更新 更多