为了账号安全,请及时绑定邮箱和手机立即绑定

以编程方式检索iPhone上的内存使用情况

以编程方式检索iPhone上的内存使用情况

拉丁的传说 2019-07-12 18:53:57
以编程方式检索iPhone上的内存使用情况我正在尝试检索我的iPhone应用程序在任何时候以编程方式使用的内存量。是的,我知道Objectalloc/泄漏。我对这些并不感兴趣,只是想知道是否有可能编写一些代码,获取所使用的字节数并通过NSLog报告它。
查看完整描述

3 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

要获取应用程序正在使用的实际内存字节,您可以执行如下示例所示的操作。但是,您确实应该熟悉各种分析工具,以及它们的设计,以便更好地了解总体的使用情况。

#import <mach/mach.h>// ...void report_memory(void) {
  struct task_basic_info info;
  mach_msg_type_number_t size = TASK_BASIC_INFO_COUNT;
  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): %lu", info.resident_size);
    NSLog(@"Memory in use (in MiB): %f", ((CGFloat)info.resident_size / 1048576));
  } else {
    NSLog(@"Error with task_info(): %s", mach_error_string(kerr));
  }}

Virtualsize结构中还有一个字段,它将为您提供可用的虚拟内存(或分配给您的应用程序的内存在任何情况下都是潜在的虚拟内存)的字节数。PGB链接到的代码将给出设备可用的内存量以及它是什么类型的内存。


查看完整回答
反对 回复 2019-07-12
?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

标头TASK_BASIC_INFO说:

/* Don't use this, use MACH_TASK_BASIC_INFO instead */

以下是使用MACH_TASK_BASIC_INFO:

void report_memory(void){
    struct mach_task_basic_info info;
    mach_msg_type_number_t size = MACH_TASK_BASIC_INFO_COUNT;
    kern_return_t kerr = task_info(mach_task_self(),
                                   MACH_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));
    }}


查看完整回答
反对 回复 2019-07-12
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

下面是为了快速显示NSLog()中的泄漏状态而增强的Report_Memory()。

void report_memory(void) {
    static unsigned last_resident_size=0;
    static unsigned greatest = 0;
    static unsigned last_greatest = 0;

    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 ) {
        int diff = (int)info.resident_size - (int)last_resident_size;
        unsigned latest = info.resident_size;
        if( latest > greatest   )   greatest = latest;  // track greatest mem usage
        int greatest_diff = greatest - last_greatest;
        int latest_greatest_diff = latest - greatest;
        NSLog(@"Mem: %10u (%10d) : %10d :   greatest: %10u (%d)", info.resident_size, diff,
          latest_greatest_diff,
          greatest, greatest_diff  );
    } else {
        NSLog(@"Error with task_info(): %s", mach_error_string(kerr));
    }
    last_resident_size = info.resident_size;
    last_greatest = greatest;}


查看完整回答
反对 回复 2019-07-12
  • 3 回答
  • 0 关注
  • 554 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信