ฉันมีความรู้พื้นฐานเกี่ยวกับการรั่วไหลของหน่วยความจำและสิ่งที่สามารถทำให้พวกเขา นั่นเป็นเหตุผลที่ฉันไม่เข้าใจถ้าฉันมีปัญหาในรหัสของฉันหรือมันเป็นบวกที่ผิดพลาด ฉันไม่ทราบว่าฉันควรแบ่งปันรหัสส่วนใดเนื่องจากโครงการไม่เล็ก แต่เพียงแค่แจ้งให้เราทราบในความคิดเห็นและฉันจะเพิ่มรหัสที่จำเป็น
ฉันใช้คอมโพเนนต์ arch navigation และทำตามรูปแบบ MVVM ฉันเพิ่มห้องสมุด LeakCanary ในภายหลังในการพัฒนาโครงการและมันก็เริ่มให้คำเตือนเกี่ยวกับอินสแตนซ์ที่เก็บไว้ทันทีเมื่อฉันนำทางระหว่างหน้าจอ
ปัญหาเกิดขึ้นเมื่อฉันเพิ่มแฟรกเมนต์ลงในสแต็กหลัง เมื่อเพิ่มแฟรกเมนต์ที่เพิ่มลงในสแต็กหลังแต่ละตัวนับอินสแตนซ์ที่เก็บไว้จะเพิ่มขึ้น เมื่อถึงค่าขีด จำกัด 5 LeakCanary จะทิ้งฮีปและจัดทำรายงาน
แต่ถ้าฉันคลิกที่ปุ่มย้อนกลับและกลับสู่หน้าจอก่อนหน้าตัวนับอินสแตนซ์ที่เก็บไว้จะลดลงและในที่สุดเมื่อกลับสู่หน้าจอที่ 1 อินสแตนซ์ที่เก็บไว้ทั้งหมดจะหายไป
ถ้าฉันดูรายงานการวิเคราะห์ฮีปมันบอกว่าตัวแปร CoordinatorLayout ซึ่งเป็นการอ้างอิงถึงCoordinatorLayout
in in xml ได้รั่วไหลออกมา หากฉันลบตัวแปรและการใช้งานทั้งหมดแล้วเรียกใช้แอปอีกครั้งฉันเห็นปัญหาเดียวกัน แต่ตอนนี้มีตัวแปรอื่นที่อ้างอิงถึงมุมมองอื่นใน xml ฉันพยายามลบมุมมองทั้งหมดและการใช้งานที่ LeakCanary รายงานว่าเป็นการรั่วไหล เมื่อมันบอกว่า a TextView
ซึ่งเพิ่งใช้ในการตั้งค่าข้อความonViewCreated
และไม่ได้ใช้ที่อื่นถูกรั่วฉันเริ่มสงสัยว่ามีปัญหาในรหัสของฉัน
ผมวิเคราะห์วิธีวงจรสายในชิ้นส่วนและพบว่าเมื่อฉันนำทางไปยังหน้าจอใหม่สำหรับส่วนที่ก่อนหน้านี้จนถึงวิธีการทั้งหมดและรวมถึงการonDestroyView
ได้รับการเรียก onDestroy
แต่ไม่ เมื่อฉันคลิกย้อนกลับonDestroy
ถูกเรียกสำหรับแฟรกเมนต์ที่อยู่ด้านบนของสแต็กหลังและตัวนับอินสแตนซ์ที่เก็บไว้จะลดลง
ฉันสงสัยว่าองค์ประกอบการนำทางจะรักษาอินสแตนซ์ของชิ้นส่วนเมื่อมันอยู่ในกองหลังและ LeakCanary เห็นว่าเป็นรอยรั่ว
onDestroyView
ด้วยการดูการผูก