2012-01-31 13 views
6

इस विषय से संबंधित विभिन्न प्रश्न हैं लेकिन उनमें से कोई भी मेरे प्रश्न का उत्तर नहीं देता है।कुंजी मान हटाए गए ऑब्जेक्ट को हटाएं जब ऑब्जेक्ट को हटाया जाता है

मैं ऑब्जेक्ट से removeObserver किसी ऑब्जेक्ट से हटाना चाहता हूं जब उस ऑब्जेक्ट को हटा दिया जाता है। मैं केवीओ का उपयोग कर रहा हूं क्योंकि कई वस्तुओं को देखा जाना चाहिए, और NSNotification उस मामले में भारी ओवरहेड है।

(एकाधिक) वस्तुओं विभिन्न अन्य वस्तुओं द्वारा मनाया जा रहा है:

यहाँ परिदृश्य है। जब observer को हटा दिया जाता है, तो मैं इसे पर्यवेक्षक के रूप में हटा सकता हूं। लेकिन जब observed अस्वीकृत हो जाता है, तो मुझे पर्यवेक्षकों के रूप में हटाने के लिए सभी observers बताना होगा। यह कैसे करना है?

उत्तर

1

जब आप मनाए जाते हैं तो आप अलग से -(void)dealloc से अधिसूचना पोस्ट कर सकते हैं। अन्य सभी पर्यवेक्षकों को प्राप्त करने पर आवश्यक अधिसूचना हटा दी जाएगी।

+0

इतनी सारी अधिसूचनाएं नहीं होंगी, और केवो का उपयोग करने का पूरा उद्देश्य पराजित हो जाएगा। इसके अलावा, यह समाप्त हो जाएगा: 1. किसी वस्तु की कुछ संपत्ति का निरीक्षण करें। 2. सभी मनाई गई वस्तुओं से, हटाए जाने पर अधिसूचना को आग लगाना। 3. Deallocation अधिसूचना को सुनें और पर्यवेक्षक को हटा दें। बहुत काम करता है। क्या कोई साफ समाधान नहीं है? – Sailesh

3

सेलेश अगर ऑब्जेक्ट (मनाया गया) हटा दिया जाता है, तो उस ऑब्जेक्ट को बदला नहीं जा सकता है या इसका मूल्य बदला नहीं जा सकता है, इसलिए यदि आपके पर्यवेक्षक एक डिलीओटेड ऑब्जेक्ट देख रहे हैं और यह अस्वीकृत वस्तु कभी भी किसी भी तरह का अवलोकन नहीं देगी अधिसूचना तो क्या पर्यवेक्षकों को हटाने का कोई मजा है ???
~~~~~~~~~~~~~~~~~~~~~ संपादित ~~~~~~~~~~~~~~~~~~~~~~~~
अरे मुझे here से कुछ चीज़ मिली। विचार यह है कि आप alive कहते हैं और alive = NO; के रूप में मनाए गए डेलोक में लिखते हैं और इस संपत्ति को बदल दिया गया है, इसलिए सभी पर्यवेक्षक अधिसूचित हो जाएंगे और इस प्रकार आप सभी पर्यवेक्षक को हटा सकते हैं।


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+2

कंसोल में यह त्रुटि संदेश देखने के बाद, आप ऑब्सर्वर को हटाना चाहते हैं, भले ही यह कोई मजेदार नहीं है :)। 'क्लास माईक्लास के एक उदाहरण 0xd89f200 को हटा दिया गया था जबकि मुख्य मूल्य पर्यवेक्षक अभी भी इसके साथ पंजीकृत थे। निरीक्षण जानकारी लीक हो गई थी, और यहां तक ​​कि किसी अन्य ऑब्जेक्ट से गलती से जुड़ा हो सकता है। – Sailesh

+0

हम्म यह एक गंभीर चीज है ... अगर मुझे कुछ मिल सकता है तो मुझे खोज करें .. उत्तर देने के लिए धन्यवाद :) –

+0

मैंने जवाब संपादित किया है ... –

2

मुझे लगता है कि यहां एक डिज़ाइन समस्या है। मनाई गई वस्तु को इसके पर्यवेक्षकों की परवाह नहीं करनी चाहिए। आप कहते हैं कि आप पर्यवेक्षकों को मनाई गई वस्तुओं dealloc विधि से हटाना चाहते हैं। लेकिन यह क्यों हटाया जाता है? यदि यह अभी भी देखा गया है कि कहीं स्वामित्व है तो इस प्रकार वस्तु को बर्बाद नहीं किया जाएगा। डीलोक द्वारा छोड़े गए पर्यवेक्षकों में अच्छे डिज़ाइन नतीजे बुलाए जाते हैं।

एक ऐसे विचार की कल्पना करें जो खुद को मॉडल ऑब्जेक्ट के पर्यवेक्षक के रूप में पंजीकृत करता है। यह मॉडल ऑब्जेक्ट या तो दृश्य में या नियंत्रक में बनाए रखा गया है। मॉडल ऑब्जेक्ट इसे तब तक कॉल नहीं करेगा जब तक कि इसे कहीं भी बनाए रखा जाए। केवल जब अंतिम स्वामित्व जारी किया जाता है, तो उसे डेलोक को कॉल करना चाहिए। तो देखें कि सभी स्वामित्व जारी किए गए हैं, दृश्य/व्यू कंट्रोलर को छोड़कर और एक पर्यवेक्षक बाईं ओर (दृश्य) है। अब दृश्य/व्यू कंट्रोलर मॉडल मॉडल पर अपना स्वामित्व जारी करने से पहले, इसे दृश्य को पर्यवेक्षक के रूप में भी हटा देना चाहिए। तो जब तक डेलोक विधि कहा जाता है, वहां कोई पर्यवेक्षक नहीं छोड़ा जाना चाहिए।

+0

एक मामले पर विचार करें जब दो वस्तुएं एक दूसरे का निरीक्षण करती हैं। आपके द्वारा सुझाए गए डिज़ाइन एक बनाए रखने चक्र बनाएंगे। किसी भी मामले में, पर्यवेक्षक के पास मनाए जाने के लिए केवल एक कमजोर संदर्भ हो सकता है, और ऐप के अन्य सभी पहलुओं पर विचार करने के अलावा अन्यथा अच्छा डिजाइन नहीं हो सकता है। – Sailesh

+1

मेरी राय में एक दूसरे को देखकर दो वस्तुएं खराब डिजाइन का मामला है। –

+0

इस उत्तर के लिए धन्यवाद। मुझे एहसास हुआ कि मॉडल पर कमजोर स्वामित्व रखने का मेरा निर्णय गलत था। मैं अब एक मजबूत रिश्ते में बदल गया, और उम्मीद है कि अब मुझे बहुत सारे केवीओ क्रैश नहीं दिख रहे हैं। – rounak

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