16

क्या हमें removeObserver: स्पष्ट रूप से उन वस्तुओं के लिए भेजना है जिन्हें पहले NSNotificationCenter पर पर्यवेक्षकों के रूप में जोड़ा गया है?एआरसी में हमें हटाने के लिए ऑब्सर्वर भेजने की ज़रूरत है: स्पष्ट रूप से?

मैं थोड़ा उलझन में हूं और इसके लिए सही उत्तर खोजने में असमर्थ हूं।

कृपया मुझे विस्तार से प्रदान करें, इसके बारे में हमें स्पष्ट रूप से ऑब्सर्वर को हटाने की आवश्यकता क्यों है, और क्यों संकलक इसे कक्षा/आवेदन में स्पष्ट रूप से नहीं डालता?

उत्तर

13

हां, आपको removeObserver: पर कॉल करने की आवश्यकता है, यदि आप मनाई गई कक्षा पर्यवेक्षक के सभी अस्वीकृत उदाहरण को कॉल नहीं कर सकती हैं।

+2

फिर एआरसी इस बारे में सावधानी बरतता क्यों नहीं है? जैसे यह [... रिलीज] रखता है; यह क्यों नहीं डालता [... हटाएं ऑब्सर्वर: ...]?/ –

+7

बेशक एनएस नॉटिफिकेशन सेंटर जानता है कि कौन देख रहा है: इसे अधिसूचनाओं को रिले करना है। ऐसा लगता है कि वे यह सुनिश्चित करने के लिए कमजोर संदर्भों को शून्य कर सकते थे कि अधिसूचना मुक्त पर्यवेक्षकों को भेजी नहीं जाती है। लेकिन मैंने डबल-चेक करने के लिए एक त्वरित डेमो बनाया है और यदि आप हटाए गए ऑब्सर्वर को कॉल नहीं करते हैं तो यह क्रैश हो जाता है: डेलोक में। डैंग। – davehayden

+0

पर्यवेक्षक के लिए कमजोर संदर्भ हो सकता है, लेकिन जब तक ऐप्पल स्पष्ट रूप से दस्तावेज नहीं करता है, यह जरूरी नहीं है, यह आवश्यक है। हो सकता है कि एक फीचर अनुरोध हमें करने की ज़रूरत है। –

5

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

+0

यदि आप आईओएस 9 और ऊपर लक्षित कर रहे हैं तो इसकी आवश्यकता नहीं है, जो कि आगे बढ़ने वाले बहुत सारे होंगे। –

2

आपको हमेशा केवीओ के साथ-साथ अधिसूचनाओं के लिए पर्यवेक्षकों को हटाने की आवश्यकता है।

7

10.11 पर्यवेक्षकों को उनके डेलोकेशन विधि में पंजीकरण करने की आवश्यकता नहीं है।

NSNotificationCenter और NSDistributedNotificationCenter नहीं रह गया है पंजीकृत पर्यवेक्षकों कि पुनः आवंटित की जाती किया जा सकता है पर सूचनाएं भेजने। यदि पर्यवेक्षक को शून्य-कमजोर संदर्भ के रूप में संग्रहीत करने में सक्षम है अंतर्निहित भंडारण पर्यवेक्षक को शून्य कमजोर संदर्भ के रूप में संग्रहीत करता है। वैकल्पिक रूप से, यदि ऑब्जेक्ट को कमजोर रूप से संग्रहीत नहीं किया जा सकता है (क्योंकि इसमें कस्टम रीटेन/रिलीज़ तंत्र है जो से रनटाइम को कमजोर रूप से स्टोर करने में सक्षम होने से रोकता है) ऑब्जेक्ट को गैर-कमजोर शून्य संदर्भ के रूप में संग्रहीत किया जाता है। इसका मतलब है कि पर्यवेक्षकों को की आवश्यकता नहीं है ताकि वे अपने डेलोकेशन विधि में पंजीकरण न करें। [1]

+0

धन्यवाद पैराग, इसे यहां जोड़ने के लिए। यहां तक ​​कि मुझे इस बारे में पता नहीं था। –

+1

अधिक समय तक एसडीके के उपयोग से बाहर निकलता है, और अधिक सही यह उत्तर अन्य उत्तरों की तुलना में अधिक सही हो जाता है। यह एक शर्म की बात है कि यह अंतिम जवाब के रूप में सूचीबद्ध है। – otto

+1

आईओएस 9 के लिए यह भी सच है (लेकिन आईओएस 8 नहीं)। रेफरी: http://useyourloaf.com/blog/unregistering-nsnotificationcenter-observers-in-ios-9/ –

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