2013-02-19 8 views
6

मेरे पास @class Foo है जिसमें __weak id bar ivar है। विभिन्न वर्गों में विधियों से कई क्रियाएं वस्तु को गायब होने का कारण बन सकती हैं और इस प्रकार bar नाली हो जाती है।कार्रवाई करना चाहते हैं जब __weak ivar niled

मैं एआरसी द्वारा स्वचालित रूप से नाइल होने पर एक क्रिया करना चाहता हूं।

यदि संभव हो, तो मैं bar को किसी संपत्ति में बदलने या कुंजी-मूल्य निरीक्षण का उपयोग करने से बचना चाहता हूं।

क्या यह भी संभव है? यदि नहीं, तो गैर-संपत्ति ivars के खिलाफ केवीओ का उपयोग किया जा सकता है?

+0

सम्मेलन का कहना है कि आपको इसे __weak आईडी बार नाम देना चाहिए। क्या आप जानते हैं कि यह वर्ग किस वर्ग है? आप इसे डेलोक विधि में संभाल सकते हैं। –

+0

रैमी: हाँ, मेरी गलती, मैंने इसे प्रश्न में तय किया (इसका वास्तविक नाम निचले मामले से शुरू हुआ)। 'Dealloc' के संबंध में, यदि संभव हो तो मैं' bar' की 'dealloc' विधि का उपयोग करने से बचना चाहूंगा। मैं इस क्रिया को '@class Foo' में ट्रिगर करना चाहता हूं। –

+0

मुझे लगता है कि आप बहुत ज्यादा चाहते हैं। –

उत्तर

2

केवीओ का सफलतापूर्वक गैर-संपत्ति IVARs पर उपयोग नहीं किया जा सकता है।

ऑब्जेक्टिव-सी के एआरसी एक आईवीएआर के दौरान आप रनटाइम से पता नहीं लगा सकते हैं।

0

मैं डेलोक को ओवरराइड करने का सुझाव देता हूं। यदि आप उस ऑब्जेक्ट के प्रकार को जानते हैं जिसे आवंटित किया जाएगा, और यह एक कस्टम क्लास है (अन्यथा इसे सबक्लस करें), ऑब्जेक्ट को डिलीओटेड होने पर आप क्रिया निष्पादित कर सकते हैं, जो वास्तव में तब होता है जब एआरसी शून्य को बनाए रखने के लिए सेट करता है और सेट करता है शून्य के लिए कमजोर चर।

+0

मैं इसे तब तक स्वीकार करूंगा जब तक केवीओ का उपयोग किए बिना कोई विधि पॉप आउट न हो जाए। चीयर्स! –

+1

हम्म, मैंने कोशिश की और '- (शून्य) निरीक्षण करें ValueForKeyPath: ... 'विधि ट्रिगर नहीं होती है, भले ही' बार' एआरसी द्वारा शून्य पर सेट किया जा रहा है (मैं इसकी निगरानी कर रहा हूं, और मैं इसे देख सकता हूं शून्य करने के लिए सेट)। प्रलेखन यह कहता है कि यह केवल गुणों के लिए काम करता है। क्या आप वाकई इवर के लिए काम करते हैं? –

+1

ठीक है, आगे परीक्षण पर, '- (शून्य) निरीक्षण करें ValueForKeyPath: ...' अगर मैं ivar कर रहा हूं '[स्वयं सेट वैल्यू: ऑब्जेक्ट फॉरकी: @ "बार"]' सेट किया गया है, लेकिन अगर मैं सेट करता हूं तो यह ट्रिगर नहीं होता है यह 'बार = ऑब्जेक्ट 'कर रहा है। किसी भी मामले में, यह तब भी ट्रिगर नहीं करता है जब एआरसी इसे शून्य पर सेट करता है, जो मैं ढूंढ रहा हूं। –

4

मैं यहाँ एक नकली प्रश्न के नेतृत्व में किया गया था, यहाँ मैं क्या जवाब है:

आपको लगता है कि KVO साथ, लेकिन आप अभी भी एक अधिसूचना प्राप्त कर सकते हैं नहीं कर सकते और का उपयोग कर अपने इवर के साथ एक वस्तु जोड़ कर इस का अनुकरण objc_setAssociatedObject(), जब कमजोर चर मर जाता है तो इसे हटा दिया जाएगा।

आप, कि बहुत ही व्यापक सूचक के शीर्ष पर निर्माण NSNotificationCenter या सिर्फ कस्टम ब्लॉकों का उपयोग कर, कैसे भारी आप एक विशिष्ट इवर मामले के लिए उस पर भरोसा करते हैं पर या उनमें से बहुत सारे के लिए निर्भर करता है सकते हैं।

इस समाधान के बारे में अच्छी बात यह है कि यह __weak ivar के साथ काम करता है, भले ही आप __weak ivar के प्रकार को नियंत्रित न करें।

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