Swift รู้จักกับ strong, weak, unowned Part 2/4 (Strong)

Ton Attapong
Seekster Development
2 min readMar 24, 2019

ใน Part ที่แล้วเราได้พูดถึง ARC กันไปแล้ว สำหรับใครที่ยังไม่ได้อ่านเข้าไปอ่านได้ที่

https://medium.com/seekster-development/swift-%E0%B8%A3%E0%B8%B9%E0%B9%89%E0%B8%88%E0%B8%B1%E0%B8%81%E0%B8%81%E0%B8%B1%E0%B8%9A-strong-weak-unowned-part-1-4-44f70d66470

สำหรับใน Part นี้จะพูดถึง Strong Reference ซึ่งหลายๆคนอาจจะเคยใช้แล้วโดยที่ไม่รู้ตัว และใน Part นี้จะยกตัวอย่างการใช้งานใน App จริงๆ

Strong Reference

รูปแบบการเก็บ Object ไว้ ไม่ให้ Object ถูกทำลาย โดยการที่โปรแกรมจะคืนค่าหรือทำลาย Object นั้นได้ในระบบ ARC เราก็สามารถทำได้ด้วยวิธีดังตัวอย่างต่อไปนี้

Ex.1

ตัวอย่างแรกนี้จะเป็นเรื่องพื้นๆที่หลายๆคนมองข้ามไปซึ่งเป็นเรื่องที่สำคัญมากๆเลยในการทำแอปพลิเคชั่น มาดูกันเลยครับ

จากรูปด้านบน

ผมประกาศ intArray เป็น [Int] โดยการประกาศทั่วๆไปแบบนี้คือ Strong Reference นะครับหากต้องการให้เป็น weak ให้ใส่ weak นำหน้า ในส่วนของ weak จะพูดใน Part ต่อไปนะครับ กลับมาที่แอป ผม Run App ขึ้นมาเฉยๆ ยังไม่ได้กดปุ่มอะไร ดูที่ Memory จะอยู่ที่ 46.6 MB นะครับ ในกรณีนี้หากผมกด Append แล้วกดไปหน้าถัดไป intArray จะไม่ถูกคืนค่านะครับ เรามาดูกันว่า Memory จะขึ้นมาเท่าไหร่

จากรูปด้านบน

จะเห็นว่า เรามาหน้าที่ 2 แล้ว โดยที่ intArray ยังมีค่าอยู่และมาพร้อมกับ Memory ที่เพิ่มขึ้น จาก 46.6 MB เพิ่มมาเป็น 47.9 MB อาจจะยังไม่เห็นภาพ เราลองกลับ Back กลับไปแล้วลองกด Append อีกครั้ง พร้อมกับ กด Next มาหน้าที่ 2 อีกครั้ง ตอนนี้ให้จำค่าที่ print ออกมาก่อนนะครับ Count: 100,000

จากรูปด้านบน

จะเห็นว่า หลังจากที่เรากลับมาหน้าแรกแล้ว แล้ว Append ใหม่อีกรอบ ข้อมูลเก่ายังคงอยู่ ยังไม่ไปไหนนะจ๊ะ ฮ่าๆ ลองดู Memory เพิ่มมาเป็น 49.3 MB แล้ว เท่านั้นยังไม่พอนะครับ ลองดูที่เรา print ค่า intArray เพิ่มมาเป็น 200,000 แล้ว ยิ่งเราทำแบบเดิมซ้ำๆอีก Memory ยิ่งใช้เยอะขึ้นไปอีก เรามาดูวิธีแก้ไขเบื่องต้นกันดีกว่าครับ

คืนค่าเถอะ!! ถ้าไม่ได้ใช้แล้ว

จากรูปด้านบน

ผมสั่งให้ intArray = nil ในบรรทัดที่ 25 เพื่อคืนค่า จะเห็นว่าผมกด Append 2 รอบ และได้ Count: nil 2 รอบด้วยกัน รวมถึง Memory ที่ใช้ยังใช้แค่ 47.9 เท่านั้นเองในขณะที่ถ้าเราไม่คืนค่า Memory จะอยู่ที่ 49.3 MB

Ex.2

เรามาดูกันอีกสักตัวอย่างนึงละกันนะครับ แบบที่ object อ้างอิงถึงกันโดยจะสร้าง class User และ class Car ขึ้นมาและให้ class User อ้างอิงถึง class Car แล้วเรามาส่องผลลัพท์กัน

เราจะใช้ Project เดิมในการทำนะครับ ><” ลองดูว่าถ้าไปหน้าถัดไปแล้ว user และ car จะถูกคืนค่าหรือเปล่า ถ้าคืนค่าสำเร็จโปรแกรมจะเข้า deinit นะครับ

จากรูปด้านบน

บรรทัดที่ 60 จะเห็นว่า เราใส่ค่าให้ user?.car = car หลังจากที่กดปุ่ม Append ใน Simulator หลังจากนั้นกด Next มาหน้าที่ 2 โดยค่าของ User ยังคงอยู่ ยังไม่ไปไหนนะจ๊ะ ฮ่าๆ เหมือนเดิมครับ เราลองให้ user = nil ดูว่าค่ายังคงอยู่ไหม

จากรูปด้านบน

จะเห็นว่าหลังจากที่เราให้ user = nil แล้ว โปรแกรมจะเข้า User deinit นั่นหมายความว่าเราคืนค่าสำเร็จ แต่เดี๋ยวก่อน​!! สำเร็จจริงๆหรอ แล้ว car ล่ะ car ยังไม่ถูกคืนค่า เมื่อเป็นเช่นนี้ เราจึงต้องคืนค่าของ car ด้วยนะครับ

สำหรับคนที่อยากโหลดโปรเจคไปลองเล่นก็โหลดได้ที่ลิ้งด้านล่างนี้เลยนะครับ

ก็จบลงไปแล้วนะครับสำหรับ Strong Reference หวังว่าจะมีประโยชน์กับหลายๆท่านและหากมีข้อผิดพลาดประการใดก็ต้องขออภัยด้วยนะครับ

--

--