2009-08-21 15 views
5

एक प्रतिनिधि या एक UIControl घटना का उपयोग कर के बारे में मेरे सवाल में, यह केंडल Helmstetter Geln के जवाब में किया गया था:आईफोन देव - प्रतिनिधि, नोटिफिकेशन, अस्वीकृत करने से पहले सदस्यता रद्द करें?

दोनों एक समान भार के साथ काम करने के लिए के बारे में कर रहे हैं - एक प्रतिनिधि के साथ आप अपने आप को सेट करें और फिर याद करने के लिए है आपके द्वारा हटाए जाने से पहले स्वयं को अनसेट करें। आपको अधिसूचनाओं के साथ एक ही काम करना है, सुनने के लिए याद रखना याद रखें और फिर आपके द्वारा हटाए जाने से पहले सदस्यता समाप्त करें।

उनका क्या मतलब है, अस्वीकार करने से पहले सदस्यता छोड़ें, स्वयं को अनसेट करें? मैं जो भी कर रहा हूं वह नहीं कर रहा हूं। क्या कोई यह बता सकता है कि यह क्या है और यह कैसे करें?

धन्यवाद !!

उत्तर

8

यदि आपकी जिंदगी उस वस्तु से कम है, जिसके लिए आप प्रतिनिधि हैं, तो आपको खुद को प्रतिनिधि के रूप में हटाने की जरूरत है। लगभग सभी मामलों में आपकी आयु उस वस्तु से बराबर या उससे अधिक है जिसके लिए आप प्रतिनिधि हैं। उस ने कहा, यह अंदर आने के लिए एक अच्छी आदत है। उस मामले पर विचार करें जहां आप UITableView के प्रतिनिधि हैं। -init में, शायद आप फोन:

self.myTableView.delegate = self; 

तो यह संभवतः -dealloc में बुद्धिमान होगा कहने के लिए

_myTableView.delegate = nil; 
[_myTableView release]; 
_myTableView = nil; 

यह है कि myTableView अन्य वस्तुओं के बनाए रखा जा सकता है ऐसा करने के लिए कारण है, तो पुनःआवंटन नहीं हो सकता है जब आप इसे छोड़ देते हैं। यदि आपके जाने के बाद यह एक प्रतिनिधि कॉल करता है, तो आपका आवेदन क्रैश हो जाएगा। तो प्रतिनिधि सूचक को साफ़ करना यहां एक अच्छा विचार है।

इसी NSNotificationCenter के लिए, आप अपने आप को -dealloc में इस प्रकार निकाल देना चाहिए:

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

यह सभी टिप्पणियों से आप निकाल देता है। यदि आपकी कक्षा कभी भी किसी अधिसूचना के लिए पंजीकृत होती है तो आपको इसे -dealloc में करना चाहिए। यदि आप ऐसा नहीं करते हैं, और एक अधिसूचना जिसे आप देख रहे थे, तब आप आने के बाद आते हैं, ऐप क्रैश हो जाएगा।

एनएसटीमीटर के लिए यह आवश्यक नहीं है क्योंकि एनएसटीमीटर अपने लक्ष्य को बनाए रखते हैं (आप)।

+1

धन्यवाद! और यूआईसींट्रोल घटनाओं के बारे में क्या? क्या मुझे [myButton removeTarget: ....] करना चाहिए? – mk12

+0

और क्या यह डेटा स्रोतों पर भी लागू होता है? – mk12

+0

यूआईसींट्रोल के लिए, यह एक दिलचस्प सवाल है। मुझे यकीन नहीं है कि addTarget: ... बरकरार रहता है। यदि ऐसा नहीं होता है, तो आप सही हैं, आपको शायद खुद को हटा देना चाहिए। डेटा स्रोत प्रतिनिधि के समान हैं। –

1

मेरा मानना ​​है कि आप बस प्रतिनिधि को शून्य पर सेट करते हैं।

myOjectOrClass.delegate = nil; 
+0

तो आपको यह निर्दिष्ट करने वाले प्रत्येक प्रतिनिधि के लिए ऐसा करना है? यदि आप नहीं करते तो क्या होता है? घटनाओं के बारे में क्या ([नियंत्रण addTarget: स्वयं कार्रवाई: ....) के साथ? – mk12

+0

और मेरी पुस्तक में कैसे आते हैं और उदाहरण कोड में मैंने इसे कभी नहीं देखा है? – mk12

+0

हम रिलीज कॉल करने से पहले शून्य सेट करने के लिए एक ही प्रतिनिधि प्रतिनिधि के पास आते हैं। –

1

UIControl addTarget विधि को पारित होने पर लक्ष्य के विरुद्ध कोई बरकरार नहीं किया जाता है। हालांकि दस्तावेज इस का विशिष्ट उल्लेख नहीं करता है, मैंने इस तथ्य को साबित करने के लिए एक सरल परीक्षण लिखा है।

यदि आप नियंत्रण की घटना के पर्यवेक्षक के रूप में एक लक्ष्य जोड़ते हैं और फिर इसे छोड़ देते हैं तो आप देखेंगे कि बनाए रखने की गिनती नीचे जा सकती है (संभावित रूप से इसे पुनः प्राप्त किया जा रहा है)।

इसका मतलब है कि नियंत्रण कभी भी लक्ष्य को को हटाने से रोक नहीं पाएगा।

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