搜尋

首頁  >  問答  >  主體

objective-c - iPhone如何用编程检索内存使用?

我想以编程的方式随时检索iPhone App的内存使用量。是的,我注意到了ObjectAlloc/Leaks。但我对那些不感兴趣,只想知道是否可以通过写代码来获取所使用的字节量,并通过NSLog报告。
谢谢!

原问题:Programmatically retrieve memory usage on iPhone

ringa_leeringa_lee2768 天前641

全部回覆(1)我來回復

  • 高洛峰

    高洛峰2017-04-21 11:20:53

    Jason Coco:
    為了獲得App實際使用的記憶體字節,你可以使用下述方式。但是,你必須要熟練各種分析工具,就像它們設計了更好看的表示整體使用的圖片一樣。

    #import <mach/mach.h>
    
    // ...
    
    void report_memory(void) {
      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));
      }
    }
    

    info.virtual_size中有個欄位可以告訴你可用的虛擬記憶體的具體位元組數(或任何情況下記憶體分配給App的潛在虛擬記憶體)。 Pgb連結的程式碼將為你提供裝置的可用記憶體和記憶體類型。


    Douglas K. Bell:
    這是加強後的report_memory(),可以在NSLog()中迅速顯示記憶體洩漏。

    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;
    }
    

    回覆
    0
  • 取消回覆