2011-06-06 8 views
7

मेरे एनएसओब्जेक्ट सबक्लास की -इनिट विधि में यह उदाहरण स्वयं को अपने कुछ कीपैथ्स के पर्यवेक्षक के रूप में जोड़ता है ताकि किसी भी कार्यवाही को ट्रिगर करने के लिए किसी भी समय प्रश्न में संपत्तियों में से कोई एक बदल जाए। जैसे।केवीओ का उपयोग करते समय स्वयं को स्वयं के पर्यवेक्षक के रूप में हटाने के लिए आवश्यक है?

[self addObserver:self forKeyPath:@"aProperty" options:0 context:nil]; 
[self addObserver:self forKeyPath:@"anotherProperty" options:0 context:nil]; 
... 

मेरा प्रश्न मैं जरूरी ही की एक पर्यवेक्षक के रूप में उदाहरण को दूर करने की आवश्यकता है वर्ग के -dealloc विधि में, है? जैसे।

[self removeObserver:self forKeyPath:@"aProperty"]; 
[self removeObserver:self forKeyPath:@"anotherProperty"]; 
... 

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

मुझे अभी तक कोई समस्या नहीं है, लेकिन यह अभी भी मुझे परेशान करता है क्योंकि मैंने इसे कभी स्पष्ट रूप से नहीं देखा है कि आप यह कर सकते हैं।

मैं बस अपना -dealloc विधि में

[self removeObserver:self forKeyPath ...] 

की एक पूरी गुच्छा लिखने के लिए होने से बचने की कोशिश कर रहा हूँ।

उत्तर

4

शायद आप पर्यवेक्षक के रूप में self को हटाए बिना दूर जा सकते हैं, लेकिन आपको नहीं करना चाहिए। आप addObserver:... कहां करते हैं, आपको बाद में removeObserver:... करना होगा।

लेकिन यह चर्चा किसी भी तरह से अप्रासंगिक है, क्योंकि self को देखने की कोई आवश्यकता नहीं है, बस अपनी संपत्ति के सेटटर में अपनी कार्रवाई को ट्रिगर करें। इससे स्पष्ट, अधिक पठनीय कोड होता है जो वास्तव में बेहतर प्रदर्शन करता है।

+3

आपकी प्रतिक्रिया के लिए धन्यवाद। मेरी कक्षा में एक अरब संपत्तियां हैं जिन्हें किसी भी घटना को ट्रिगर करने की आवश्यकता होती है जब भी उनमें से कोई भी बदलता है, इसलिए मैंने सोचा कि केवीओ और @ सिंथेसाइज्ड सेटर्स का उपयोग करके एक बेजिलियन सेटर्स लिखने से अधिक सुविधाजनक होगा। – hyperspasm

+1

एक त्वरित नोट पर, स्वयं का निरीक्षण करने के वैध कारण हैं, उदा। सुपर क्लास की केवल पढ़ने योग्य संपत्ति को देखते हुए (उदाहरण के लिए जब NSNotification subclassing)। इसके अलावा केवीओ अपडेट भी हो सकते हैं जो सेटर द्वारा ट्रिगर नहीं किए जाते हैं (लेकिन इच्छा/किया गया चेंज वैल्यूफोरकी: सेटर के बाहर) –

+0

कैलायर्स और कोर डेटा में एक और कारण 'गतिशील 'गुण है, जहां आपका स्वयं का सेटर स्वचालित सेटर तोड़ देगा कार्यक्षमता। –

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