iOS低内存崩溃,但内存使用率非常低

时间:2011-05-12 15:41:02

标签: iphone objective-c ios ipad memory-management

很长一段时间以来,这一直困扰着我。我的应用程序运行占用大约2.74MB的内存。没关系。但是当它创建一个UIWebView时,它上升到大约5.87MB并且继续崩溃。这些是在我的第一代iPad上运行时在仪器中的Live Bytes下给出的值。

我找不到崩溃日志。以下内容来自控制台:

MyApp[1205] <Warning>: Received memory warning. Level=1
MyApp[1205] <Warning>: applicationDidReceiveMemoryWarning
SpringBoard[30] <Warning>: Received memory warning. Level=1
MobileMail[1199] <Warning>: Received memory warning. Level=1
configd[26] <Notice>: jetsam: kernel memory event (95), free: 428, active: 1853, inactive: 1011, purgeable: 338, wired: 15122
configd[26] <Notice>: jetsam: kernel termination snapshot being created
com.apple.launchd[1] <Notice>: (UIKitApplication:com.apple.mobilemail[0x8966]) Exited: Killed: 9
com.apple.launchd[1] <Notice>: (UIKitApplication:com.MyApp.MyApp[0xdd4f]) Exited: Killed: 9
SpringBoard[30] <Warning>: Application 'Mail' exited abnormally with signal 9: Killed: 9
kernel[0] <Debug>: launchd[1207] Builtin profile: MobileMail (sandbox)
SpringBoard[30] <Warning>: Application 'MyApp' exited abnormally with signal 9: Killed: 9
configd[26] <Debug>: CaptiveNetworkSupport:UIAllowedNotifyCallback:70 uiallowed: false
ReportCrash[1206] <Error>: libMobileGestalt loadBasebandMobileEquipmentInfo: CommCenter error: 1:45
ReportCrash[1206] <Error>: libMobileGestalt copyInternationalMobileEquipmentIdentity: Could not get mobile equipment info dictionary
ReportCrash[1206] <Error>: Saved crashreport to /Library/Logs/CrashReporter/LowMemory-2011-05-12-160645.plist using uid: 0 gid: 0, synthetic_euid: 0 egid: 0

我删除了对imageNamed的所有调用,将自动释放的内容更改为alloc / release。但我无法理解为什么会发生这种情况,这让我感到疯狂。

感谢您的帮助!

3 个答案:

答案 0 :(得分:51)

你几乎肯定会使用比你想象的更多的内存。

要了解您的应用实际使用的内容,您必须做些什么并不明显,但是一旦您做了几次,您就会记住。

  1. 使用分配效果工具运行。
  2. 点击“Allocations”(截图中)
  3. 下的VM Tracker“行”
  4. 点击“自动快照”
  5. 然后你会看到你的脏内存(截图中目前为20.34MB)。

    这可以让您更好地了解您的应用程序退出的原因。你可能会发生一些大的泄漏事件。

    祝你好运!

    This screenshot will help

答案 1 :(得分:22)

我有两件事要补充:

  1. 如前一个answer中所述,UIImage的bitmat不考虑内存量Leaks告诉您应用正在使用!所以你可能会有很多UIImages使用大量的内存购买而未显示总数。我的建议是使用Allocations来检查应用程序运行时创建和销毁的UIImage对象的数量。
  2. this answer中所述,请使用以下代码

    -(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));
        }
    }
    
  3. 查看操作系统为您的应用分配的内存量。这是您应用正在使用的内存上更准确的数字。 (你需要#import“mach / mach.h”)

    喝彩!

答案 2 :(得分:-5)

您快速按下该菜单按钮2次,您将看到该应用程序单击所有应用程序的x,然后打开您需要的应​​用程序。