iPhone应用程序使用150 MB内存,仍然没有低内存警告!

时间:2011-07-22 08:36:32

标签: iphone ios4

我有一个问题应用程序,基于导航,我创建并每次从笔尖推送我的tableviews。没有泄漏,仪器中的实时字节大约为2-3 MB。

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

最奇怪的是,我对didreceivememorywarning和didunloadview方法发出了警告,但没有收到任何内存警报!

- 为什么我从来没有得到任何内存警告和viewDidUnload甚至应用程序使用150 MB和更多的内存? - 应用程序有效,但这个内存使用对Apple商店来说是个问题吗?

3 个答案:

答案 0 :(得分:16)

有些东西正在发生。请尝试以下代码来检查应用程序使用的内存的操作系统版本

-(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”

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

答案 1 :(得分:2)

我只是在viewDidDisappear方法中添加self.view = nil,它可以正常恢复,现在好多了。 tnx Felz的帮助

答案 2 :(得分:0)

老问题,但补充了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];
}

运行应用程序并观察日志以了解内存使用情况。