0Pricing
Swift Academy · บทเรียน

วงจรการคงอ้างอิง: สาเหตุและการตรวจหา

ระบุวงจรการคงอ้างอิงระหว่างอ็อบเจ็กต์กับโคลสเชอร์ด้วย Instruments

วงจรการคงอ้างอิง: สาเหตุและการตรวจหา เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

ยินดีต้อนรับ

วงจรการถือครองเกิดขึ้นเมื่อวัตถุสองชิ้นขึ้นไปมีการอ้างอิงแบบถือครองถึงกัน ทำให้ ARC ไม่สามารถลดจำนวนลงถึงศูนย์ได้ และทำให้เกิดหน่วยความจำรั่ว

วงจรระหว่างวัตถุสองชิ้นแบบง่าย

```swift class Owner { var pet: Pet? } class Pet { var owner: Owner? } var o: Owner? = Owner() var p: Pet? = Pet() o?.pet = p // Owner → Pet (strong) p?.owner = o // Pet → Owner (strong) o = nil; p = nil // Neither deinit called — cycle! ```

วงจรระหว่างแม่กับลูก

```swift class Node { var children: [Node] = [] var parent: Node? // strong → cycle with parent } let root = Node() let child = Node() root.children.append(child) child.parent = root // cycle ```

วงจรจากการจับค่าของคลอเชอร์

```swift class ViewController { var onComplete: (() -> Void)? func setup() { onComplete = { // closure strongly captures self self.doWork() // ← cycle! } } } ```

วงจรจากรูปแบบผู้รับมอบหมาย

```swift protocol TaskDelegate: AnyObject { func didFinish() } class Task { var delegate: TaskDelegate? // if strong → potential cycle } class Manager: TaskDelegate { var task = Task() init() { task.delegate = self } // Manager → Task → Manager } ```

การตรวจจับด้วย Instruments

ใช้ Xcode Instruments → Leaks: 1. เรียกใช้แอปใน Instruments 2. คลิกเครื่องมือ Leaks 3. เครื่องหมายสีแดงแสดงวัตถุที่รั่ว 4. เจาะลึกเพื่อดูกราฟการอ้างอิง อีกทางเลือกหนึ่งคือกำหนด `deinit { print(...) }` แล้วตรวจสอบว่ามีการเรียกใช้หรือไม่

การตรวจจับด้วยกราฟหน่วยความจำของ Xcode

ในตัวดีบักของ Xcode: Debug > Memory Graph Debugger คลิกวัตถุที่รั่วเพื่อดูสายโซ่การอ้างอิง — วงจรจะแสดงเป็นลูปปิดในกราฟ

รูปแบบวงจรที่พบบ่อย

• ผู้รับมอบหมายเก็บผู้รับมอบหมายไว้อย่างถือครอง • คลอเชอร์จับ `self` ด้วยการอ้างอิงแบบถือครอง • การอ้างอิงแบบถือครองสองทิศทางระหว่างแม่กับลูก • ผู้สังเกตการณ์ของ NotificationCenter ถือคลอเชอร์ที่จับ self ไว้ • เป้าหมายของ Timer คือ `self` (แบบถือครอง)

วงจรการถือครองของ Timer

```swift class Poller { var timer: Timer? func start() { timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [weak self] _ in self?.poll() // weak self breaks cycle } } deinit { timer?.invalidate() } } ```

วงจรการอ้างอิงของ NotificationCenter

```swift class Listener { var token: NSObjectProtocol? init() { token = NotificationCenter.default.addObserver(forName: .UIApplicationDidBecomeActive, object: nil, queue: .main) { [weak self] _ in self?.refresh() } } deinit { NotificationCenter.default.removeObserver(token!) } } ```

ตรวจสอบอย่างรวดเร็ว

วงจรการเก็บรักษาใน ARC คืออะไร

สรุปทบทวน

ประเด็นสำคัญ: • วงจรการเก็บรักษา: การอ้างอิงแบบ strong ซึ่งอ้างอิงถึงกันและกัน → ไม่มีออบเจ็กต์ใดถูกยกเลิกการจัดสรร • พบบ่อยใน: ตัวมอบหมาย คลอสเชอร์ และความสัมพันธ์แบบสองทิศทางระหว่างออบเจ็กต์แม่กับลูก • ตรวจหาได้ด้วย Instruments Leaks หรือ Xcode Memory Graph Debugger • แก้ไขด้วยการอ้างอิงแบบ `weak` หรือ `unowned` • Timer และ NotificationCenter ก็ทำให้เกิดวงจรได้เช่นกัน — ตัดวงจรด้วย `[weak self]` ถัดไป: การอ้างอิงแบบ weak และ unowned

คำถามที่พบบ่อย

บทเรียน “วงจรการคงอ้างอิง: สาเหตุและการตรวจหา” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “วงจรการคงอ้างอิง: สาเหตุและการตรวจหา” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “วงจรการคงอ้างอิง: สาเหตุและการตรวจหา”

ระบุวงจรการคงอ้างอิงระหว่างอ็อบเจ็กต์กับโคลสเชอร์ด้วย Instruments คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “วงจรการคงอ้างอิง: สาเหตุและการตรวจหา” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม

ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ARC นับจำนวนการอ้างอิงอย่างไร
  2. วงจรการคงอ้างอิง: สาเหตุและการตรวจหา
  3. การอ้างอิงแบบ weak และ unowned
  4. รายการจับค่าของโคลสเชอร์และ [weak self]
← กลับไปที่ Swift Academy