मेरे छोटे iPad ऐप में मेरे पास एक "स्विच भाषा" फ़ंक्शन है जो एक पर्यवेक्षक का उपयोग करता है। हर दृश्य नियंत्रक अपने पर्यवेक्षक के साथ खुद को पंजीकृत करता है viewDidLoad:
।
- (void)viewDidLoad
{
[super viewDidLoad];
[observer registerObject:self];
}
जब उपयोगकर्ता "भाषा बदलें" बटन को हिट करता है, तो नई भाषा मेरे मॉडल में संग्रहीत होती है और पर्यवेक्षक को सूचित किया जाता है और updateUi:
अपने पंजीकृत वस्तुओं पर एक चयनकर्ता को बुलाता है ।
यह तब बहुत अच्छी तरह से काम करता है, जब मैं एक TabBarController में नियंत्रकों को देखता हूं। ऐसा इसलिए है क्योंकि जब टैब बार लोड होता है, तो यह अपने चाइल्ड कंट्रोलर से टैब आइकनों को देखे बिना, विचारों को इनिशियलाइज़ किए बिना प्राप्त कर लेता है, इसलिए viewDidLoad:
इसे नहीं कहा जाता है, इसलिए उन व्यू कंट्रोलर्स को भाषा परिवर्तन सूचनाएँ नहीं मिलती हैं। इस वजह से, मैंने अपने registerObject:
कॉल को init
विधि में स्थानांतरित कर दिया ।
जब मैं viewDidLoad:
अपने पर्यवेक्षक के साथ पंजीकरण करता था, तो मैं viewDidUnload:
अपंजीकृत करता था। चूंकि अब मैं पंजीकरण कर रहा हूं init
, इसलिए इसमें अपंजीकृत होने की बहुत अधिक संभावना है dealloc
।
लेकिन यहाँ मेरी समस्या है। जब मैं लिखता हूं:
- (void) dealloc
{
[observer unregisterObject:self];
[super dealloc];
}
मुझे यह त्रुटि मिली:
ARC ने 'डीललोक' का स्पष्ट संदेश भेजने से मना किया
चूंकि मुझे [super dealloc]
सुपरक्लास को ठीक से साफ करने के लिए कॉल करने की आवश्यकता है , लेकिन एआरसी मना करता है कि, मैं अब फंस गया हूं। क्या कोई दूसरा तरीका है जब मेरी वस्तु मर रही हो, सूचित किया जाए?