【问题标题】:iPhone app uses 150 MB memory and still no low memory warning!iPhone 应用程序使用 150 MB 内存,仍然没有低内存警告!
【发布时间】:2011-10-10 21:06:41
【问题描述】:

我有一个问题应用程序,基于导航,我每次都从笔尖创建和推送我的表格视图。没有泄漏,仪器中的实时字节似乎约为 2-3 MB。

我在真实设备(越狱的 IOS4 iPhone)中进行了测试,当我深入导航(大约 200 个页面推送)时,我可以看到内存使用量高达 150 MB!当我导航回根目录时,它们都被释放了,但这不是一种奇怪的行为吗? (每个 nib 视图大约 800 KB,其中没有大数据或图像)

最奇怪的是,我给didreceivememorywarning和didunloadview方法加了一些alert,却没有收到任何内存alert!

-为什么即使应用程序使用 150 MB 或更多内存,我也从未收到任何内存警告和 viewDidUnload? -应用程序可以工作,但这种内存使用对 Apple 商店来说是个问题吗?

【问题讨论】:

  • 您是否在未越狱的 iPhone 上尝试过您的应用程序?此外,您应该尝试使用 Edge iPhone 或 3G iPhone,了解内存使用情况。
  • @Luzal 我针对 ios4,越狱可能是个问题?

标签: iphone ios4


【解决方案1】:

正在发生一些时髦的事情。尝试使用以下代码检查您的应用使用多少内存的操作系统版本

-(void) report_memory {
    struct task_basic_info info;
    mach_msg_type_number_t size = sizeof(info);
    kern_return_t kerr = task_info(mach_task_self(),
                                   TASK_BASIC_INFO,
                                   (task_info_t)&info,
                                   &size);
    if( kerr == KERN_SUCCESS ) {
        NSLog(@"Memory in use (in bytes): %u", info.resident_size);
    } else {
        NSLog(@"Error with task_info(): %s", mach_error_string(kerr));
    }


}

您需要#import "mach/mach.h"

这将告诉您操作系统已授予您的应用多少内存。因此,如果您看到的是一些奇怪的 Instruments 行为,这应该会有所启发。

【讨论】:

  • 我在模拟器中尝试了这段代码,应用程序从 28 Mb 开始,当我通过导航时增加到 60-70MB(每次推送增加 300Kb)我根本没有收到任何内存警告。
  • 嗯,模拟器的内存比设备多很多。在设备上试用。
  • 我在设备上试过,每次推送都会保留大约 1 mb 的内存!我可以在没有任何低内存警告的情况下使用 200MB 的内存,但是当我打开其他应用程序以填充内存然后返回时,我看到它释放了大约 50Mb 左右,但仍然没有任何迹象表明它击中了 didreceivememoryWarning 方法?!这里发生了什么?以及为什么每个推送的视图都会浪费 1 mb 的内存
  • 每个推送视图用户 1Mb 的事实并不奇怪。视图在导航堆栈中时仍然存在。他们在记忆中。奇怪的是该应用程序并没有崩溃。我通常的问题是应用程序崩溃!不是相反。干杯。
  • 是否应该在每次推送控制器时卸载视图? Apple 商店对巨大的内存使用有何看法?
【解决方案2】:

我只是在 viewDidDisappear 方法中添加 self.view=nil ,它可以工作并且我可以恢复,现在好多了。 tnx Felz 寻求帮助

【讨论】:

    【解决方案3】:

    老问题,但补充 fsaint 的答案,以防有人仍然想知道如何使用它:

    它可以放在任何你想记录内存使用的地方,比如在一个特定的视图控制器中。要记录整个应用程序,您可以放入 AppDelegate.m。在文件顶部:

    #import <mach/mach.h>
    

    将方法粘贴到类中的任意位置:

    - (void) report_memory {
        struct task_basic_info info;
        mach_msg_type_number_t size = sizeof(info);
        kern_return_t kerr = task_info(mach_task_self(),
                                       TASK_BASIC_INFO,
                                       (task_info_t)&info,
                                       &size);
        if( kerr == KERN_SUCCESS ) {
            long mb = info.resident_size / 1000000;
            NSLog(@"Memory in use (in Mbytes): %lu", (long)mb);
        } else {
            NSLog(@"Error with task_info(): %s", mach_error_string(kerr));
        }
    }
    

    包含一个计时器以从 didFinishLaunchingWithOptions 调用此方法:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        (...)
        [NSTimer scheduledTimerWithTimeInterval: 2.0
                                         target: self
                                       selector: @selector(report_memory)
                                       userInfo: nil
                                        repeats: YES];
    }
    

    运行应用并查看您的日志以了解内存使用情况。

    【讨论】:

      猜你喜欢
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-09
      • 2013-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多