Swift รู้จักกับ strong, weak, unowned Part 3/4 (Weak)
หลังจากที่พูดถึงเรื่อง ARC, Strong reference แล้ววันนี้เราจะมาพูดถึง weak กันบ้าง นะครับ โดยเจ้า Weak เนี่ยหลายๆคนเคยใช้แล้ว อย่างเช่น พวก Outlet ก็เป็น Weak เหมือนกัน
Weak Reference คืออะไร
Weak Reference คือ ตัวชี้(pointer) ที่ชี้ไปยัง object นั้นๆ แต่!! ได้แค่มอง เป็นเจ้าของไม่ได้นะครับ และไม่สามารถปกป้อง object ให้ไม่ถูกทำลายโดย ARC ได้อีก !! แล้วข้อดีของ weak คืออะไรล่ะในเมื่อ weak สมชื่อจริงๆ ฮ่าๆ ข้อดีของ weak คือสามารถโดนทำลายโดยอัตโนมัติ อาจจะยังไม่เห็นภาพเรามาดูตัวอย่างกันนะครับ
กรณีที่ Object อ้างอิงถึงกันและกัน ถ้าเราไม่ใช้ weak เราจะไม่สามารถคืนค่าได้ดังตัวอย่างต่อไปนี้
เริ่มจากเรามี class User โดยที่ User มีรถเป็นของตัวเองนั่นคือ Car
และใน class Car เราก็จะมีเจ้าของรถนั่นคือ User
จะเห็นว่าทั้งสองมีการอ้างอิงถึงกัน
ทีนี้มาดู Code ใน ViewController ที่เราจะทดลองกันบ้าง
จากรูปด้านบน viewDidDisappear() ผมสั่งให้ user = nil และ car = nil แล้วนั้น deinit จะถูกเรียกหรือเปล่า มาดูผลลัพท์กันครับ
จากรูปด้านบน ผมกด Create ->Next -> Back จะเห็นว่าโปรแกรมไม่เข้า deinit เลย
ทีนี้เราลองใช้ weak ดูสิ
หลังจากใช้ weak ในบรรทัดที่ 12 แล้ว
ลองกดแบบเดิมดูนะครับ Create -> Next -> Back และผลที่ได้คือ
deinit ถูกเรียกเรียบร้อย แค่ Weak ตัวเดียวเราก็สามารถช่วยเราได้ สำหรับใครที่อยากลอง clone project ไปลองเล่นกดได้ที่ลิ้งด้านล่างเลยครับ
ก็จบแล้วนะครับสำหรับ Weak Reference หากมีข้อผิดพลาดประการใดต้องขอโทษด้วยนะครับ หวังว่าบทความนี้จะเป็นประโยชน์ให้กับหลายๆคนนะครับ สำหรับคนที่ยังไม่ได้อ่านเรื่อง ARC, Strong สามารถกดที่ลิ้งด้านล่างได้เลยนะครับ