Instruments สำหรับการจัดสรรและการรั่วไหล
ติดตามการจัดสรรบนฮีป ค้นหาหน่วยความจำรั่ว และอ็อบเจ็กต์ซอมบี้
Instruments สำหรับการจัดสรรและการรั่วไหล เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
เครื่องมือ Allocations
เครื่องมือ Allocations จะติดตามการจัดสรรและคืนการจัดสรรบนฮีปทุกรายการ และแสดงการเพิ่มขึ้นของหน่วยความจำตามเวลา
// Instruments → Allocations template
// Shows live bytes, allocation count, and transient objectsการวิเคราะห์การเพิ่มขึ้นของฮีป
ทดลองใช้แอปของคุณและดูกราฟไบต์ที่ใช้งานอยู่ การเพิ่มขึ้นอย่างต่อเนื่องโดยไม่หยุดนิ่งบ่งชี้ว่ามีหน่วยความจำรั่ว
// Normal: allocations rise and fall as views appear/disappear
// Leak: allocations only grow, never releasedการวิเคราะห์รุ่นของอ็อบเจ็กต์
ทำเครื่องหมายสแนปช็อตของรุ่นก่อนและหลังขั้นตอนการใช้งานของผู้ใช้ เพื่อดูว่าอ็อบเจ็กต์ใดคงอยู่โดยไม่คาดคิด
// Instruments toolbar → "Mark Generation"
// Perform action (e.g., open and close a screen)
// "Mark Generation" again
// Inspect objects in the new generation that weren't releasedเครื่องมือ Leaks
เครื่องมือ Leaks จะสแกนฮีปเป็นระยะ และระบุอ็อบเจ็กต์ที่ถูกจัดสรรแต่ไม่สามารถเข้าถึงได้ ซึ่งมักเกิดจากวงจรการครอบครอง
// Run Leaks alongside Allocations in the "Leaks" template
// Red bars in the timeline = leaked objects detected
// Click a bar to see the leaked object graphการอ่านกราฟหน่วยความจำรั่ว
กราฟอ็อบเจ็กต์ของ Leaks จะแสดงว่าอ็อบเจ็กต์ใดครอบครองกันเองเป็นวงจร และช่วยชี้ตำแหน่งต้นทางของวงจรการครอบครอง
// Example cycle:
// ViewController → ViewModel → Closure → ViewController
// Instruments draws the reference edges visuallyการตรวจจับวงจรการครอบครองในคลอเชอร์
หน่วยความจำรั่วที่พบบ่อยที่สุดคือคลอเชอร์ครอบคลุม self อย่างแน่นหนา ขณะที่ self ก็เก็บคลอเชอร์นั้นไว้
class MyVC: UIViewController {
var onComplete: (() -> Void)?
override func viewDidLoad() {
super.viewDidLoad()
// LEAK: closure captures self; self holds onComplete
onComplete = { self.dismiss(animated: true) }
// FIX:
onComplete = { [weak self] in self?.dismiss(animated: true) }
}
}เครื่องมือ VM Tracker
VM Tracker จะแสดงภูมิภาคหน่วยความจำเสมือนและเพจที่ถูกแก้ไข ความกดดันของหน่วยความจำที่ถูกแก้ไขสูงจะทำให้ iOS ยุติการทำงานของแอป
// Instruments → "VM Tracker" in allocation instrument
// Look for: large __DATA dirty pages, high CG raster memoryอ็อบเจ็กต์ซอมบี
เปิดใช้ Zombie Objects ใน Instruments เพื่อจับอ็อบเจ็กต์ที่ถูกคืนการครอบครองมากเกินไป อ็อบเจ็กต์เหล่านั้นจะถูกเปลี่ยนเป็น "ซอมบี" ซึ่งจะบันทึกเหตุการณ์เมื่อมีการเข้าถึง
// Instruments → Edit → Record Settings → Enable Zombie Objects
// Accessing a zombie prints: "*** -[MyObject method] sent to deallocated instance"ภาพถ่ายฮีป
เปรียบเทียบสถานะฮีปสองสถานะด้วย "ภาพถ่ายฮีป" เพื่อค้นหาอ็อบเจ็กต์ที่ยังคงอยู่ระหว่างภาพถ่ายทั้งสอง เหมาะอย่างยิ่งสำหรับตรวจจับหน่วยความจำรั่วในตัวควบคุมมุมมอง
// After navigating to and from a screen twice:
// Heap should return to baseline
// Objects remaining in the diff = leaked view controllers or modelsMetricKit สำหรับหน่วยความจำในระบบจริง
ใช้ MXMetricPayload เพื่อรวบรวมข้อมูลหน่วยความจำและประสิทธิภาพจากผู้ใช้จริงในระบบใช้งานจริง
import MetricKit
class AppDelegate: UIApplicationDelegate, MXMetricManagerSubscriber {
func didReceive(_ payloads: [MXMetricPayload]) {
payloads.forEach { print($0.memoryMetrics as Any) }
}
}ตรวจสอบความเข้าใจ
กราฟ "ไบต์ที่ใช้งานอยู่" ที่เพิ่มขึ้นอย่างต่อเนื่องในเครื่องมือ Allocations บ่งชี้อะไร
ทบทวนบทเรียน
ใช้ Allocations เพื่อติดตามการเพิ่มขึ้นของฮีปและสแนปช็อตของรุ่น ใช้ Leaks เพื่อตรวจจับวงจรการครอบครองและดูกราฟอ็อบเจ็กต์ ใช้ Zombie Objects สำหรับข้อผิดพลาดจากการคืนการครอบครองมากเกินไป แก้ไขคลอเชอร์ด้วย [weak self] และใช้ MetricKit เพื่อติดตามหน่วยความจำของผู้ใช้จริงในระบบใช้งานจริง
คำถามที่พบบ่อย
บทเรียน “Instruments สำหรับการจัดสรรและการรั่วไหล” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “Instruments สำหรับการจัดสรรและการรั่วไหล” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “Instruments สำหรับการจัดสรรและการรั่วไหล”
ติดตามการจัดสรรบนฮีป ค้นหาหน่วยความจำรั่ว และอ็อบเจ็กต์ซอมบี้ คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “Instruments สำหรับการจัดสรรและการรั่วไหล” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม
ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐาน Instruments: ตัววิเคราะห์เวลา
- Instruments สำหรับการจัดสรรและการรั่วไหล
- ตัวตรวจสอบเธรดหลักและการค้าง
- ปรับเส้นทางที่ใช้เวลามาก: COW การแทรกโค้ด และการปรับเฉพาะทาง