2017-04-26 15 views
6

मेरे ऐप में मैं प्रतिनिधियों का उपयोग कर रहा हूं, ताकि जब भी यह तैयार हो, मैं डेटा को पढ़ सकूं।कमजोर प्रतिनिधि शून्य

मैं दो वर्गों से एक प्रतिनिधि को बुला रहा हूं। यहां मेरा कोड

protocol MyDelegate: class { 
    func getData() 
} 

class MyDelegateCalss { 

    weak var delegate: MyDelegate?  
    func loadData() { 

     // doing some actions   

     if(self.delegate != nil){ 
      self.delegate!.getData!() 
     } 
    } 
} 

एक कक्षा में मैं इस विधि को तालिकादृश्य संख्या में लोड कर रहा हूंऑफक्शन प्रतिनिधि विधि।

class A: UIViewController, MyDelegate { 


    func somefunc(){ 
     let mydelegatecls : MyDelegateCalss = MyDelegateCalss() 
     mydelegatecls.delegate = self 
     mydelegatecls.loadData() 
    } 


    func getData(){ 
     // Doing some actions 
    } 
} 

यह विधि मैं अन्य कैल्स से लोड कर रहा हूं।

class B: UIViewController, MyDelegate { 


    open func testfunc(){ 

    let mydelegatecls : MyDelegateCalss = MyDelegateCalss() 
     mydelegatecls.delegate = self 
     mydelegatecls.loadData() 
    } 



    func getData(){ 
     // doing some other stuff  
    } 

} 



class C: UIViewController { 

     func testfunc(){ 

     let b : B = B() 
      b.testfunc() 
     } 
    } 

कक्षा ए से यहां मेरा प्रतिनिधि ठीक काम कर रहा है। और मैं getData विधि को कॉल करने में सक्षम हूं।

कक्षा बी से

, प्रतिनिधि नहीं के बराबर और GetData विधि को देखने में असमर्थ

कहा जाता है अगर मैं प्रतिनिधि अपनी कार्यशील ठीक संदर्भित करती हो जाता है। लेकिन इससे स्मृति रिसाव हो जाएगा।

इस मामले को कैसे संभाला जा सकता है?

+0

कहाँ ए और बी में पहली 3 लाइनों है? क्या वे बस कोड स्निपेट की तरह कक्षा में डाल दिए जाते हैं? यदि आप उन्हें 'viewDidLoad' पर ले जाते हैं तो क्या होता है? – Losiowaty

+0

क्या मुझे पता चलेगा कि इस परिदृश्य का वास्तविक उपयोग क्या है? – CodeChanger

+0

संपादित .. 3 लाइनें कुछ तरीकों से हैं .. दृश्य में नहीं है DidLoad @ Losiowaty – Sarah

उत्तर

3

आपकी delegate var को weak के रूप में घोषित किया गया है। यदि आपके द्वारा प्रतिनिधि के रूप में असाइन किए गए ऑब्जेक्ट पर कोई मजबूत संदर्भ नहीं है (MyDelegate लागू करना), तो delegate ऑब्जेक्ट जारी होने के तुरंत बाद nil पर जायेगा (उदाहरण के लिए, उस दायरे का अंत जहां आप इसे तुरंत चालू करते हैं)।

कुछ अच्छा पढ़ने: https://cocoacasts.com/how-to-break-a-strong-reference-cycle/

+0

यह विशेष रूप से उल्लेख करने के लिए समझदार होगा कि वस्तु दायरे से बाहर हो जाती है और रिलीज हो जाती है (यानी 'testFunc() 'के अंत में) और इसे हल करने के तरीके (यानी' MyDelegateCalss 'को स्टोर करने के लिए क्लास वेरिएबल जोड़ें) – Losiowaty

संबंधित मुद्दे