नीचे वर्ग एक बहुत ही अनोखी जीवन चक्र है, जो मुझे आवश्यकता है अस्थायी रूप से बाहर अशक्त lateinit
गुणlateinit Kotlin संपत्ति शून्य पर सेट करने के लिए कैसे
class SalesController : BaseController, SalesView {
@Inject lateinit var viewBinder: SalesController.ViewBinder
@Inject lateinit var renderer: SalesRenderer
@Inject lateinit var presenter: SalesPresenter
lateinit private var component: SalesScreenComponent
override var state = SalesScreen.State.INITIAL //only property that I want to survive config changes
fun onCreateView(): View { /** lateinit variables are set here */ }
fun onDestroyView() {
//lateinit variables need to be dereferences here, or we have a memory leak
renderer = null!! //here's the problem: throws exception bc it's a non-nullable property
} }
यहाँ है कि यह कैसे ढांचे द्वारा प्रयोग किया जाता है के लिए है ।
controller.onCreateView() //same instance of controller
controller.onDestroyView() //same instance of controller
controller.onCreateView() //same instance of controller
controller.onDestroyView() //same instance of controller
मेरे lateinit
गुण चाकू से इंजेक्ट किया जाता है, और मैं onDestroyView
में null
करने के लिए उन्हें निर्धारित करने की आवश्यकता है - या एक स्मृति रिसाव है। हालांकि यह कोटलिन में संभव नहीं है, जहां तक मुझे पता है (प्रतिबिंब के बिना)। मैं इन गुणों को निरर्थक बना सकता हूं, लेकिन यह कोटलिन की शून्य सुरक्षा के उद्देश्य को हरा देगा।
मुझे यकीन नहीं है कि इसे कैसे हल किया जाए। आदर्श रूप से कुछ प्रकार का एनोटेशन प्रोसेसर हो सकता है जो onDestroyView
में स्वचालित चर को स्वचालित रूप से निकालने के लिए जावा कोड उत्पन्न करेगा?
आपके पास रिसाव क्यों है? हो सकता है कि समस्या इसके गुणों की बजाय SalesController पर है? मुझे लीक समस्याओं से बचने के लिए डैगर द्वारा इंजेक्शन वाली संपत्ति को स्पष्ट रूप से सेट करने की आवश्यकता नहीं है ... – Massimo
@ मासिमो कंडक्टर के नियंत्रक उदाहरण कॉन्फ़िगरेशन परिवर्तनों में जीवित रहते हैं https://github.com/bluelinelabs/Conductor – ZakTaccardi
यदि आपको उन्हें निरस्त करने की आवश्यकता है, तब आपको 'देर से' रखने की आवश्यकता नहीं है। और मुझे पूरा यकीन है कि आपके पास कोई रिसाव नहीं है, आप बस कुछ परिभाषाओं को मिला रहे हैं। यदि आपका प्रेजेंटर आपके व्यू को संदर्भित करेगा, तो आप रिसाव करेंगे, विपरीत नहीं – Dimezis