2011-03-03 17 views
16

के लिए संपत्ति "असाइन करें" और "बनाए रखें" आईओएस डेवलपर्स के लिए, प्रतिनिधि लगभग हर जगह उपयोग किए जाते हैं।प्रतिनिधि

और है कि हम इस

कारण परिपत्र पाश मुद्दा Why are Objective-C delegates usually given the property assign instead of retain?

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

धन्यवाद

उत्तर

26

documentation का कहना है:

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

टूट नहीं किया जा सकता उदाहरण के लिए, चलो एक UITableViewController कि UITableViewDelegate प्रोटोकॉल लागू करता है पर विचार करें। UITableView को इसके व्यू कंट्रोलर द्वारा बरकरार रखा गया है, हालांकि UITableView इसके प्रतिनिधि को बरकरार नहीं रखता है।

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

अब कल्पना करें कि UITableView अपने प्रतिनिधि को बरकरार रखता है। UITableViewController कम से कम +2 की एक बरकरार गिनती होगी। इसके मालिक के साथ एक और दूसरा UITableView के साथ। जब UITableViewController के स्वामी ने इसे रिलीज़ किया है, तो बरकरार गिनती +1 पर जाएगी, और शून्य की अपेक्षा नहीं की जाएगी, और इसलिए डीलोक विधि तब तक नहीं बुलाई जाएगी जब तक कि बनाए रखने की गणना शून्य तक न पहुंच जाए। शून्य तक पहुंचने के लिए, UITableViewController को अपने UITableView को रिलीज़ करने की आवश्यकता होगी जो उसके प्रतिनिधि (UITableViewController) को रिलीज़ करेगी। चूंकि UITableViewController केवल इस दृश्य को अस्वीकार करते समय अपने दृश्य (UITableView) को निपटाएगा क्योंकि कभी भी ऐसा नहीं होगा क्योंकि बनाए रखने की गणना +1 को नहीं चलेगी।

(चलो विचार स्मृति चेतावनी और किसी भी अन्य संभव मामले में नहीं ले ... मैं सिर्फ देखा कि ViewController/देखें इस उदाहरण के लिए सबसे अच्छा विकल्प नहीं है, लेकिन मैं बहुत ज्यादा पहले से ही लिखा है। :))

क्या यह समझ में आता है?

+0

हां, एक महान समझ बनाएं और बहुत बहुत धन्यवाद! आपके मामले में, ए UITableViewController है, बी TableView है, इसलिए TableView में प्रतिनिधि के लिए "असाइन करें" का उपयोग करने का एकमात्र उचित तरीका है। एक और आम मामले के बारे में विचार करें, ए व्यू कंट्रोलर है, बी एक और व्यू कंट्रोलर है, ए एक नया बी बनाते हैं, और बी में प्रतिनिधि के लिए "बनाए रखें" का उपयोग करते हैं, और ए भी बी जारी कर सकता है, इसलिए इस मामले में, "बनाए रखना" ठीक है बी में प्रतिनिधि क्या यह समझ में आता है? – Forrest

+0

इसे प्राप्त नहीं हुआ। आप कहते हैं कि ए बी बनाता है, किसी बी के लिए प्रतिनिधि के रूप में उपयोग बी, और इसलिए, एव्यू कंट्रोलर (बनाए रखें) = बी, और एडिगेट (असाइन) = बी या ए बी पर एक प्रतिनिधि है, और इसलिए, ए। ViewController (बनाए रखें) = बी, और B.delegate (असाइन) = ए? कौन सा मामला है? – vfn

+0

ए और बी के बारे में संदर्भ लिंक से आ रहा है उद्देश्य-सी प्रतिनिधियों को आमतौर पर बनाए रखने के बजाय संपत्ति असाइनमेंट क्यों दिया जाता है? – Forrest

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