首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS 獲取設備內存使用信息的正規方案:sysctl + mach_task_basic_info

     編輯:程式設計綜合問答

廢棄 API 警示

`NSRealMemoryAvailable()` 已在 iOS 7+ 標記廢棄,雖仍可調用,但返回值僅為物理內存總量,無法區分 App 佔用/系統佔用/空閒,不符合現代監控需求。

標準方案:mach_task_basic_info (獲取當前進程佔用)

#import 

- (uint64_t)currentAppMemoryUsage {
    mach_task_basic_info_data_t info;
    mach_msg_type_number_t count = MACH_TASK_BASIC_INFO_COUNT;
    kern_return_t kr = task_info(mach_task_self(),
                                 MACH_TASK_BASIC_INFO,
                                 (task_info_t)&info,
                                 &count);
    if (kr == KERN_SUCCESS) {
        return info.resident_size; // 物理內存駐留大小 (bytes)
    }
    return 0;
}

系統級內存統計:sysctl (總量/空閒/活躍/非活躍/佔線)

#import 

- (NSDictionary *)systemMemoryStats {
    int mib[2] = {CTL_HW, HW_MEMSIZE};
    uint64_t physicalMemory;
    size_t len = sizeof(physicalMemory);
    sysctl(mib, 2, &physicalMemory, &len, NULL, 0);

    vm_statistics64_data_t vmStats;
    mach_msg_type_number_t count = HOST_VM_INFO64_COUNT;
    host_statistics64(mach_host_self(), HOST_VM_INFO64, (host_info64_t)&vmStats, &count);

    uint64_t pageSize = vmStats.page_size;
    uint64_t freeMem = vmStats.free_count * pageSize;
    uint64_t activeMem = vmStats.active_count * pageSize;
    uint64_t inactiveMem = vmStats.inactive_count * pageSize;
    uint64_t wiredMem = vmStats.wire_count * pageSize;

    return @{
        @"total": @(physicalMemory),
        @"free": @(freeMem),
        @"active": @(activeMem),
        @"inactive": @(inactiveMem),
        @"wired": @(wiredMem),
        @"appUsed": @([self currentAppMemoryUsage])
    };
}

為什麼手機助手數據不同?

  • 助手通常顯示 系統可用內存 = free + inactive + 可清理的 purgeable。
  • App 進程內只能看到自己的 `resident_size`,無權讀取其他進程內存。
  • 不要試圖在 App 內計算「系統剩餘內存」**,數值無參考價值,且可能被拒審。

最佳實踐

  • 僅監控 **自身進程內存增長趨勢**,超過閾值(如 200MB)主動釋放緩存、圖片解碼隊列。
  • 使用 `MLeaksFinder` / `FBAllocationTracker` 定位洩漏。
  • 釋放內存調用 `[NSURLConnection cancel]`、`SDImageCache clearMemory` 等。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved