objective c - ऑब्जेक्टिव-सी प्रतिनिधियों को आम तौर पर बनाए रखने के बजाय संपत्ति असाइनमेंट क्यों दिया जाता है?




objective-c ios (3)

मैं स्कॉट स्टीवंसन द्वारा बनाए गए अद्भुत ब्लॉग के माध्यम से सर्फिंग कर रहा हूं, और मैं 'असाइन' संपत्ति बनाम 'बनाए रखने' प्रतिनिधियों को असाइन करने की मौलिक उद्देश्य-सी अवधारणा को समझने की कोशिश कर रहा हूं। ध्यान दें, दोनों कचरा एकत्रित वातावरण में समान हैं। मैं ज्यादातर गैर-जीसी आधारित पर्यावरण से संबंधित हूं (उदाहरण: आईफोन)।

सीधे स्कॉट के ब्लॉग से:

"असाइन किया गया कीवर्ड एक सेटर उत्पन्न करेगा जो प्रतिलिपि बनाने या बनाए रखने के बजाए सीधे आवृत्ति चर को मान निर्दिष्ट करता है। यह एनएसआईएनटेगर और सीजीएफलोट, या ऑब्जेक्ट्स जैसे कि आप सीधे नहीं हैं, जैसे कि प्रतिनिधियों जैसे आदिम प्रकारों के लिए सबसे अच्छा है।"

इसका क्या अर्थ है कि आप सीधे प्रतिनिधि वस्तु का मालिक नहीं हैं? मैं आम तौर पर अपने प्रतिनिधियों को बरकरार रखता हूं, क्योंकि यदि मैं नहीं चाहता कि वे अस्थियों में चले जाएं, तो मेरे लिए इसका ख्याल रखना होगा। मैं आमतौर पर अमूर्त UITableViewController अपने संबंधित डेटा स्रोत और प्रतिनिधि से दूर भी। मैं उस विशेष वस्तु को भी बरकरार रखता हूं। मैं यह सुनिश्चित करना चाहता हूं कि यह कभी नहीं चलेगा इसलिए मेरे UITableView के पास हमेशा इसके प्रतिनिधि हैं।

क्या कोई आगे बता सकता है कि मैं कहां / क्यों गलत हूं, इसलिए मैं बनाए रखने के बजाए प्रतिनिधियों पर असाइन संपत्ति का उपयोग करने के उद्देश्य-सी 2.0 प्रोग्रामिंग में इस सामान्य प्रतिमान को समझ सकता हूं?

धन्यवाद!


इसके पीछे एक कारण चक्र बनाए रखने से बचने के लिए है। बस उस परिदृश्य से बचने के लिए जहां ए और बी दोनों ऑब्जेक्ट एक-दूसरे को संदर्भित करते हैं और उनमें से कोई भी स्मृति से मुक्त नहीं होता है।

Acutally असाइन करने के लिए आदिवासी प्रकारों जैसे NSInteger और CGFloat, या ऑब्जेक्ट्स जो आप सीधे नहीं हैं, जैसे प्रतिनिधियों के लिए सबसे अच्छा है।


क्योंकि प्रतिनिधि संदेश भेजने वाली वस्तु प्रतिनिधि के स्वामित्व में नहीं है।

कई बार, यह दूसरी तरफ है, जब एक नियंत्रक स्वयं को दृश्य या खिड़की के प्रतिनिधि के रूप में सेट करता है: नियंत्रक दृश्य / खिड़की का मालिक होता है, इसलिए यदि व्यू / विंडो के प्रतिनिधि का स्वामित्व होता है, तो दोनों ऑब्जेक्ट्स एक दूसरे के स्वामित्व में होंगे। यह, ज़ाहिर है, एक बरकरार चक्र है, एक ही परिणाम के साथ एक रिसाव के समान (वस्तुओं जो मृत जीवित रहना चाहिए)।

अन्य बार, वस्तुएं सहकर्मी हैं: न तो कोई दूसरा मालिक है, शायद इसलिए कि वे दोनों एक ही तीसरे वस्तु के स्वामित्व में हैं।

किसी भी तरह से, प्रतिनिधि के साथ वस्तु को अपने प्रतिनिधि को बरकरार नहीं रखना चाहिए।

(रास्ते में कम से कम एक अपवाद है। मुझे याद नहीं है कि यह क्या था, और मुझे नहीं लगता कि इसके लिए एक अच्छा कारण था।)

अनुपूरक (जोड़ा गया 2012-05-19): एआरसी के तहत, आपको assign करने के बजाय weak उपयोग करना चाहिए। ऑब्जेक्ट मरने पर कमजोर संदर्भ स्वचालित रूप से nil हो जाते हैं, जिससे संभावना समाप्त हो जाती है कि प्रतिनिधि वस्तु मृत प्रतिनिधि को संदेश भेजना समाप्त कर देगी।

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

एआरसी और एमआरसी दोनों के तहत गैर-ऑब्जेक्ट मानों के लिए assign उचित है।


प्रतिनिधियों को बनाए रखने से बचने का कारण यह है कि आपको एक बनाए रखने चक्र से बचने की आवश्यकता है:

ए बी बनाता है बी स्वयं को बी के प्रतिनिधि के रूप में सेट करता है ... ए को इसके मालिक द्वारा जारी किया जाता है

यदि बी ने ए को बरकरार रखा था, ए को रिलीज़ नहीं किया जाएगा, क्योंकि बी बी का मालिक है, इस प्रकार ए का डेलोक कभी नहीं बुलाया जाएगा, जिससे ए और बी दोनों रिसाव हो जाएंगे।

आपको ए जाने के बारे में चिंता नहीं करनी चाहिए क्योंकि यह बी का मालिक है और इस प्रकार इसे डेलोक में छुटकारा पाता है।





delegates