Bu, 07/01/2019 tarihinde Mojave 10.4.6'da Xcode 11 üzerinde test edilmiştir.
Önceki yanıtların tümü yanlış sonucu döndürür .
Apple'ın Quinn “The Eskimo!” Tarafından yazılan beklenen değeri nasıl elde edeceğiniz aşağıda açıklanmıştır.
Bu kullanır phys_footprint
VAR'ı Darwin > Mach > task_info
ve yakından Xcode en ayıklama gezginindeki hafıza göstergesi değeri ile eşleşen .
Döndürülen değer bayt cinsindendir.
https://forums.developer.apple.com/thread/105088#357415
Orijinal kod aşağıdaki gibidir.
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
}
Sınıf düzeyinde bir Swift yöntemleri kümesi oluşturmak için bunu biraz değiştirmek, gerçek baytların ve ekran için MB cinsinden biçimlendirilmiş çıktının kolayca geri döndürülmesini sağlar. Bunu, incelememiz gereken herhangi bir potansiyel sızıntı veya tahsis olup olmadığını görmek için aynı testin birden çok yinelemesinden önce ve sonra kullanılan belleği kaydetmek için otomatik bir UITest paketinin parçası olarak kullanıyorum.
// 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
}
}
Zevk almak!
Not: Girişimci bir kodlayıcı, sınıfa statik bir biçimlendirici eklemek isteyebilir, böylece usedMBAsString
yalnızca 2 anlamlı ondalık basamak döndürür.