Ini telah diuji pada Xcode 11 di Mojave 10.4.6 pada 07/01/2019.
Semua jawaban sebelumnya memberikan hasil yang salah .
Berikut adalah cara mendapatkan nilai yang diharapkan yang ditulis oleh Quinn Apple "The Eskimo!".
Ini menggunakan phys_footprint
var from Darwin > Mach > task_info
dan sangat cocok dengan nilai dalam pengukur memori di navigator Debug Xcode .
Nilai yang dikembalikan dalam byte.
https://forums.developer.apple.com/thread/105088#357415
Kode asli mengikuti.
func memoryFootprint() -> mach_vm_size_t? {
// The `TASK_VM_INFO_COUNT` and `TASK_VM_INFO_REV1_COUNT` macros are too
// complex for the Swift C importer, so we have to define them ourselves.
let TASK_VM_INFO_COUNT = mach_msg_type_number_t(MemoryLayout<task_vm_info_data_t>.size / MemoryLayout<integer_t>.size)
let TASK_VM_INFO_REV1_COUNT = mach_msg_type_number_t(MemoryLayout.offset(of: \task_vm_info_data_t.min_address)! / MemoryLayout<integer_t>.size)
var info = task_vm_info_data_t()
var count = TASK_VM_INFO_COUNT
let kr = withUnsafeMutablePointer(to: &info) { infoPtr in
infoPtr.withMemoryRebound(to: integer_t.self, capacity: Int(count)) { intPtr in
task_info(mach_task_self_, task_flavor_t(TASK_VM_INFO), intPtr, &count)
}
}
guard
kr == KERN_SUCCESS,
count >= TASK_VM_INFO_REV1_COUNT
else { return nil }
return info.phys_footprint
}
Memodifikasi ini sedikit untuk membuat kumpulan metode Swift tingkat kelas memungkinkan pengembalian byte aktual dan keluaran yang diformat dengan mudah dalam MB untuk ditampilkan. Saya menggunakan ini sebagai bagian dari rangkaian UITest otomatis untuk mencatat memori yang digunakan sebelum dan setelah beberapa iterasi dari tes yang sama untuk melihat apakah kami memiliki potensi kebocoran atau alokasi yang perlu kami perhatikan.
// Created by Alex Zavatone on 8/1/19.
//
class Memory: NSObject {
// From Quinn the Eskimo at Apple.
// https://forums.developer.apple.com/thread/105088#357415
class func memoryFootprint() -> Float? {
// The `TASK_VM_INFO_COUNT` and `TASK_VM_INFO_REV1_COUNT` macros are too
// complex for the Swift C importer, so we have to define them ourselves.
let TASK_VM_INFO_COUNT = mach_msg_type_number_t(MemoryLayout<task_vm_info_data_t>.size / MemoryLayout<integer_t>.size)
let TASK_VM_INFO_REV1_COUNT = mach_msg_type_number_t(MemoryLayout.offset(of: \task_vm_info_data_t.min_address)! / MemoryLayout<integer_t>.size)
var info = task_vm_info_data_t()
var count = TASK_VM_INFO_COUNT
let kr = withUnsafeMutablePointer(to: &info) { infoPtr in
infoPtr.withMemoryRebound(to: integer_t.self, capacity: Int(count)) { intPtr in
task_info(mach_task_self_, task_flavor_t(TASK_VM_INFO), intPtr, &count)
}
}
guard
kr == KERN_SUCCESS,
count >= TASK_VM_INFO_REV1_COUNT
else { return nil }
let usedBytes = Float(info.phys_footprint)
return usedBytes
}
class func formattedMemoryFootprint() -> String
{
let usedBytes: UInt64? = UInt64(self.memoryFootprint() ?? 0)
let usedMB = Double(usedBytes ?? 0) / 1024 / 1024
let usedMBAsString: String = "\(usedMB)MB"
return usedMBAsString
}
}
Nikmati!
Catatan: pembuat kode yang giat mungkin ingin menambahkan pemformat statis ke kelas sehingga usedMBAsString
hanya mengembalikan 2 tempat desimal yang signifikan.