दिलचस्प पोस्ट
UIButton सामग्री मोड सेटिंग को सुन नहीं है? PHP का उपयोग कर SQL सर्वर में स्ट्रिंग कैसे बचें? MySQL स्क्रिप्ट आदेश रेखा से पैरामीटर पास करें मैं वर्चुअलवेव में पीथोनपाथ के लिए एक पथ कैसे जोड़ूं? क्यों उनके कंटेनर से बचने के फ्लोटिंग तत्वों को अतिप्रवाह छुपा दिया जाता है? जीएसएन्स टाइप टूनेशन कैसे काम करता है? Node.js – मोंगोज़ – एक संग्रह मौजूद है या नहीं अजगर स्क्रिप्ट को किसी अन्य पायथन स्क्रिप्ट से कॉल करने का सबसे अच्छा तरीका क्या है? गणितीय अभिव्यक्तियों का मूल्यांकन करने का सर्वोत्तम और सबसे छोटा तरीका रेल 3.1 और jquery-UI संपत्तियां Std :: नक्शा में कुंजी के रूप में char * का उपयोग करना डिफ़ॉल्ट निर्माता के बिना ऑब्जेक्ट सरणी प्रारंभ मुझे TypeError क्यों मिलता है: प्रकार 'फ्लोट' के गैर-इंट द्वारा अनुक्रम को गुणा नहीं कर सकता? git: कैसे कुछ नई शाखा को कमाने के लिए कदम जावा में लिंक्ड सूची की एक सरणी नहीं बना सकता …?

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

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

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

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

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

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

धन्यवाद!

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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