iphone - AddObserver को कॉल करने और ओब्सर्वर तरीकों को हटाने के लिए संभावित स्थान




cocoa notifications (2)

दरअसल, यह एक बुरा विचार है जब स्मृति कम हो जाती है, तो आपके दृश्य नियंत्रक को एक मेमोरी चेतावनी भेजी जा सकती है। इस उदाहरण में डिफ़ॉल्ट व्यवहार आपका दृश्य साफ़ करना है (यदि आप वर्तमान में स्क्रीन पर नहीं हैं)। इस मामले में, आप व्यूडिडलोड संदेश को दूसरी बार भेजा जा सकता है (स्मृति ईवेंट के बाद, जब आपके दृश्य को अपने नेविगेशन नियंत्रक द्वारा स्क्रीन पर वापस लाया जाता है।) इस प्रकार आपको एक ही ऑब्जेक्ट के दो रजिस्ट्रेशन होंगे, लेकिन केवल एक ही हटाने (इसके डेलोक में)

एक बेहतर समाधान या तो एक ध्वज सेट करने के लिए है जो आपने पंजीकृत किया है, या अपने init पद्धति में पंजीकरण करने के लिए।

मेरे पास एक ऐसा मामला है जहां बच्चा दृश्य अपने माता-पिता के दृश्य को सूचना भेजता है। अब मैं addObserver: बुला रहा हूं addObserver: में removeObserver: और removeObserver: में removeObserver: :। लेकिन, मैं यह अनुमान लगा रहा हूं कि यह देखने के बाद से सही नहीं viewWillAppear: जब दृश्य रिफ्रेश होता है तो कॉल करता है

[[NSNotificationCenter defaultCenter] addObserver: (id)observer selector: (SEL)aSelector name: (NSString *)aName object: (id)anObject];

[[NSNotificationCenter defaultCenter] removeObserver: (id)observer name: (NSString *)aName object: (id)anObject];

धन्यवाद।


बेन का अधिकार - लेकिन मुझे लगता है कि एक और, संभवतः नाजुक, उसके आस-पास का रास्ता। मैं सिर्फ यह खोज कर रहा था क्योंकि मैं हमेशा के लिए "... प्राप्त किया गया था जबकि महत्वपूर्ण मूल्य पर्यवेक्षक अभी भी इसके साथ पंजीकृत थे"

मुझे क्यों नहीं पता है - लेकिन जब मैं अपने init पद्धति में ओब्सर्वर जोड़ता था, और अपने dealloc पद्धति में ओब्सर्वर को हटा देता था - मुझे अभी भी केवीओ मिल रहा था संदेश अभी भी देखा जा रहा है मैंने कदम बढ़ाया और सत्यापित किया कि मेरे निकाले जाने वाले ऑब्ज़र्वर को सही ढंग से बुलाया जा रहा था।

मैंने अपने addobserver को इसके बजाय viewDidLoad विधि में स्थानांतरित कर दिया, और यह काम करने के लिए लग रहा था।

मैंने एक निकास ओब्सर्वर को देखने में छोड़ दिया हैडडयूएनलोड और डेअलोक में; लेकिन मुझे ये पसंद नहीं है क्योंकि यह संतुलित नहीं है लेकिन सामान्य परिस्थितियों में, मेरे विचार डीडयूएनलोड को नहीं बुलाया जाता है - अगर मैं कम मेमोरी नोटिफिकेशन प्राप्त करता हूं तो यह सिर्फ सुरक्षा है

लेकिन मैं संभवतया उस स्थिति में देख सकता हूं जहां कम स्मृति घटना आती है, देखेंडडयूएनलोड को कहा जाता है। अगर मैं उसके बाद कुछ समय बाद डेलोल मारा (इससे पहले कि मैं फिर से दृश्यडिडलोड मारा), मैं दोबारा ओब्सर्वर को कॉल करूंगा!

तो, मुझे लगता है कि मैं इसे अपने विचार में रखना होगा डीडलोड, और मेरे डेलॉक।

मुझे अभी भी पता नहीं है कि मैं सही तरीके से काम क्यों नहीं करता अगर मैं अपने init पद्धति में एडॉपरसर्वर करता हूं