ทำไม Flex Listener ควรใช้ Weak Reference

วันนี้นั่งรื้อฟื้นความจำ อธิบายให้ @pitiphong_p ฟังว่าทำไมเวลา addEventListener แล้วต้องใส่ argument ช่องสุดท้ายให้เป็น true ลองดูก่อนละกันว่าหน้าตามันเป็นยังไง

public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void

useWeakReference หมายความว่าเวลาที่ GC มาเก็บกวาดแล้วนับว่ามี reference ไปที่ object นี้เท่าไหร่บ้าง มันจะไม่นับ reference นี้คำถามคือ ทำไมต้องทำให้ reference ไปที่ listener function เป็น weak ก็ลองดูจาก diagram ด้านล่างดู

FlexListener3

ที่ Observer จะมี reference ไปหามันจาก 2 Object คือตัวที่เป็นคนเพิ่มมันไปให้ Observable กับตัว Observable เองแต่เวลาที่เราเลิกใช้ Component ใน Flex เรามักจะจับทิ้งแค่ Component ที่เป็นคนเก็บ Observable มันเลยมีขยะก้อนนึงหลงเหลืออยู่คือ Observer นั่นเอง ทางแก้ก็มีสองทางคือ ตอนเลิกใช้ก็ removeEventListener ด้วยหรือบอกให้มันไม่ต้องนับ reference นี้เวลา GC มาเก็บกวาด

เป็นเรื่องที่ถูกลืมไปแล้วแบบเกือบสนิท วันนี้มาอธิบายอีกที จดอีกทีซะเลย พร้อมวาดรูปอธิบายความเข้าใจของตัวเองอีกที แต่กว่าจะรื้อได้ แป๊กไปสองรอบ =_=

เพิ่มเติม: พี่ป๊อก(@pphetra) มาแนะนำใน comment เลยคัดลอกมาไว้ตรงนี้ด้วยเลย ขอบคุณครับที่แนะนำ :D

ในกรณีทั่วไปที่เราประกาศ function เวลาที่ function นั้นมันจะถูกกำจัดทิ้งไปก็คือตอนที่ Object ไม่มี reference หาแล้วแต่ anonymous function ต่างออกไปตรงที่ขอบเขตของมันอยู่แค่ block ที่สร้างมันเท่านั้น เหมือนกับตัวแปร ดังนั้นถ้าหากทำให้ reference ที่ชี้ไปที่ function นั้นเป็น weak แล้ว function นั้นทำงานเสร็จ สิ่งที่เกิดขึ้นคือ reference ไปที่ function ไม่มี แถม reference จาก Observable ก็เป็น Weak อีกพร้อมถูกกำจัดทุกเมื่อ


FlexListener2

กรณีนี้มีวิธีเดียวเพื่อให้ Observer ยังคงอยู่คือให้ Observable reference หา function นั้นไว้


FlexListener

คำถาม: ผมจินตนาการถึง reference ต่างๆ ถูกหรือป่าวเนี๊ยะ =_=?

About llun

Just a programmer

, ,

  • http://pphetra.blogspot.com/ pphetra

    น่าจะเขียนเตือน กรณี function เราเป็น anonymous nested inner function, อันนี้จะใช้ week reference ไม่ได้. แต่ถ้ามีตัวแปรชี้ หรือเป็น class level member function ก็ใช้ได้โลด

    • http://llun.info llun

      โอลืมกรณีนั้นซะสนิท เพราะมันจะไม่มี reference จาก component ไปชัดๆ แบบนั้น ขอบคุณครับที่เตือน แหะๆ

  • DeathscytheSephiroth

    อ่า แล้วถ้าเกิดมันควรใช้เป็น Weak เสียส่วนใหญ่ ไมค่า default มันไม่เป็น true ละครับ