दिलचस्प पोस्ट
60 मिलियन प्रविष्टियां, एक निश्चित महीने से प्रविष्टियां चुनें। डेटाबेस को कैसे अनुकूलित करें? जब भी printf () सिर्फ "% f" के साथ ठीक है, तो scanf () को युगल के लिए "% lf" की आवश्यकता क्यों है? .NET 2.0 रनटाइम पर LINQ किसी दिए गए नंबर के विभाजक की संख्या की गणना करने के लिए एल्गोरिथम एक iPhone पर "भाषण बबल" कैसे आकर्षित किया जाए? एफबी ओपनग्राफ ओग: छवि चित्र नहीं खींच रहा है (संभवतः https?) प्रतिबिंब के माध्यम से एक नाम स्थान में सभी प्रकार प्राप्त करना संरचना में संरचना को प्रतिलिपि बनाएँ कैसे जावास्क्रिप्ट का उपयोग कर फ़ाइल में पढ़ा और लिखना सी # में भेदभावित यूनियन कैसे mysql रूट पासवर्ड रीसेट करें? "पॉइंटर टू पॉइन्टर टू गैर-कॉन्स्ट" को "पॉइंटर टू पॉइन्टर टू कॉन्स्ट" करने के लिए क्यों यह कानूनी नहीं है? किसी अन्य थ्रेड से यूआई विधि को कैसे खोलें बच्चे के ऊपर आने के लिए एक मूल तत्व कैसे प्राप्त करें आर में एक संख्यात्मक सूची तत्वों को योग कैसे करें

उद्देश्य-सी प्रतिनिधियों को आमतौर पर बनाए रखने के बजाय संपत्ति को क्यों दिया जाता है?

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

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

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

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

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

धन्यवाद!

वेब के समाधान से एकत्रित समाधान "उद्देश्य-सी प्रतिनिधियों को आमतौर पर बनाए रखने के बजाय संपत्ति को क्यों दिया जाता है?"

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

ए बनाता है बी ए खुद ही बी के प्रतिनिधि के रूप में सेट करता है … ए उसके मालिक द्वारा जारी किया जाता है

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

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

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

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

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

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

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


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

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

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

ध्यान दें कि जब आपके पास असाइन किया गया कोई प्रतिनिधि होता है, तो यह हमेशा यह निर्धारित करना महत्वपूर्ण है कि जब भी ऑब्जेक्ट को वितरित किया जा रहा है, तो प्रतिनिधि को मूल्य निरूपित करना होता है – इसलिए किसी ऑब्जेक्ट को डेलोक में प्रतिनिधि संदर्भों को सुलझाने के लिए सावधान रहना चाहिए, यदि नहीं ऐसा कहीं और किया

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

असामान्य रूप से असाइन किया जा सकता है जैसे आदिम प्रकार जैसे NSInteger और CGFloat, या ऑब्जेक्ट जिन्हें आप सीधे नहीं देते, जैसे प्रतिनिधि