2012-08-30 9 views
16

मैं एक अनुभवी आईओएस देव हूं और मैंने कुछ ऐपकिट विकास में अपना हाथ लगाने का फैसला किया है। कुछ समायोजन हैं जो मैं एपीआई-वार बना रहा हूं, लेकिन अन्यथा ओएस एक्स विकास को ढूंढ रहा हूं, क्या हम कहेंगे, 'परिचित'।ऐपकिट में विकास करते समय, आईबी एक संपत्ति क्यों बनाती है जो रखती है, बजाय बनाए रखने के बजाय?

मैं इंटरफ़ेस बिल्डर में मेरी AppKit UI के निर्माण किया गया है और पाया है कि जब मैं WYSIWYG संपादक का उपयोग अपने कोड फाइलों में गुण पैदा करने के लिए, एप्पल निम्नलिखित पैदा कर रही है:

@property (assign) IBOutlet NSTableView *tableView; 

मैं इस बहुत ही उत्सुक लगता है क्योंकि आईओएस में काम करने के डिफ़ॉल्ट तरीका मुझे नेतृत्व है | यह करने के लिए:

@property (nonatomic, retain) IBOutlet NSTableView *tableView; 

मुझे लगता है कि मैं एक ही स्मृति की कमी है कि मैं मोबाइल पर कर की जरूरत नहीं है मैक विकास में, जहां एक दृश्य मिल सकता है अनलोड किया गया और मजबूत संदर्भ की आवश्यकता हो सकती है यूआई तत्वों के लिए ences।

ऐपकिट मामले में मैं बहुत अच्छी तरह से मान सकता हूं कि मेरे यूआई तत्व हमेशा तब तक रहेंगे जब तक कि मैं दृश्य पदानुक्रम के साथ परेशान न हो और इसे अपने मूल दृश्य से हटा दूं। अनजाने में खतरनाक पॉइंटर्स तक पहुंचने से बचने के लिए हर समय एक मजबूत संदर्भ होना प्रतीत होता है।

ऐप्पल एक मजबूत व्यक्ति के बजाय यहां एक कमजोर संदर्भ क्यों बना रहा है?

क्या मैं मजबूत संदर्भों का उपयोग करके कुछ अनपेक्षित परिणामों के लिए खुद को स्थापित कर रहा हूं (लेकिन dealloc में ठीक से रिलीज़ हो रहा है)? क्या यहां कुछ पैटर्न है कि मुझे याद आ रही है?

उत्तर

16

फ़ाइल के स्वामी के रूप में, आपको निब में किसी भी और सभी शीर्ष-स्तरीय वस्तुओं का स्वामित्व होना चाहिए। आपको आम तौर पर उन वस्तुओं के भीतर किसी भी वस्तु का स्वामित्व करने की आवश्यकता नहीं होती है, क्योंकि माता-पिता की वस्तु अपने बच्चे की वस्तुओं का मालिक होगा; उदाहरण के लिए, एक खिड़की अपने विचारों का मालिक होगा।

AppKit's nib loader implicitly retains all top-level objects on behalf of the File's Owner. (यह @property से पहले समझ में बनाया है, संश्लेषित accessors, और एआरसी अस्तित्व में है।) इस प्रकार, weak भले ही प्रासंगिक गुण हैं या unsafe_unretained (उत्तरार्द्ध assign के लिए एक पर्याय जा रहा है), मालिक वास्तव में स्वामी होगा शीर्ष स्तर की वस्तुओं। और यदि आप दूसरी तरफ जाते हैं और उन गुणों को strong (a.k.a. retain) बनाते हैं, तो एफओ में दो प्रत्येक ऑब्जेक्ट के स्वामित्व हैं: अंतर्निहित स्वामित्व, और strong -प्रोपर्टी स्वामित्व।

मान लें कि आप मैन्युअल संदर्भ गिनती का उपयोग कर रहे हैं, तो आप awakeFromNib में अंतर्निहित स्वामित्व जारी कर सकते हैं, लेकिन यह अभी काम कर रहा है। जब तक आप निब लोड होने के बाद उन वस्तुओं में से किसी एक को प्रतिस्थापित नहीं कर रहे हैं (उदा।, किसी अन्य तालिका दृश्य के लिए तालिका दृश्य को स्वैप करें), unsafe_unretained संपत्ति बिना किसी अतिरिक्त बनाए रखने या किसी भी किए गए काम के ठीक काम करेगी।

unsafe_unretained नाम दिया गया है (और उस नाम को ऑब्जेक्ट गुणों के लिए assign से अधिक पसंद किया गया है), हालांकि। विंडो-और-इसके-दृश्य उदाहरण लौटते हुए, मान लीजिए कि आप एक खिड़की के मालिक हैं और इसके विचारों में से एक के बारे में जानते हैं। दृश्य का पर्यवेक्षण शायद उसका एकमात्र मालिक है, इसलिए, जब आप विंडो बंद करते हैं (या उपयोगकर्ता इसे बंद कर देता है), तो दृश्य जारी हो जाएगा और परिणामस्वरूप हटा दिया जाएगा। यदि आपकी संपत्ति दृश्य में unsafe_unretained/assign है, तो भी आपको अभी भी इस मृत वस्तु के बारे में पता है, और दृश्य को संदेश भेजने का प्रयास करने से क्रैश या अपवाद हो सकता है।

आपको एआरसी पर स्विच करना चाहिए और संपत्ति को weak के रूप में घोषित करना चाहिए। इस तरह, कोई अनावश्यक स्वामित्व नहीं बनाया जाता है, और जब दृश्य मर जाता है तो संपत्ति स्वचालित रूप से nil पर सेट हो जाएगी, जिससे आने वाले रिलीज को ओवर-रिलीज़ किया जा सकता है।

(यदि आप नहीं फ़ाइल के मालिक, कि से कोई भी आप पर लागू होता है और आप शायद अपने गुण की घोषणा करनी चाहिए आप मनचाहे ढंग से। या तो weak या strong कैसे आप अपने स्वामित्व पदानुक्रम को देखने के आधार पर, एक अच्छा विकल्प हो सकता है और आप किस प्रकार की ऑब्जेक्ट का संदर्भ दे रहे हैं।)

आईओएस पर, यूआईकिट के लेखकों ने अब-समस्याग्रस्त निहित बनाए रखा। आपको अपने स्वामित्व लिखने की उम्मीद है; यदि आपके पास किसी निब या स्टोरीबोर्ड से ऑब्जेक्ट का स्वामित्व है, तो आप strong प्रॉपर्टी लिखते हैं, और यदि आप केवल इसके बारे में जानना चाहते हैं, तो आप weak या unsafe_unretained लिखते हैं, जैसा कि आप उम्मीद करेंगे।

टी एल; डॉ:Hysterical reasons.

+1

मुझे डर है कि इस सवाल का जवाब होने जा रहा था, लेकिन बहुत अच्छी तरह से समझाया था, फिर भी। –

+0

तो हमें अभी भी 'dealloc' में' [tableView रिलीज़] 'की आवश्यकता होगी? यदि हां, तो एआरसी का उपयोग करते समय 'रिलीज' कब कॉल किया जाता है? – MrMage

+0

@MrMage: आप आमतौर पर टेबल व्यू का स्वामित्व नहीं रखते हैं, क्योंकि आप इसे सामान्य रूप से खिड़की या कंटेनर व्यू में रख सकते हैं, न कि निब के शीर्ष स्तर पर। आपके पास विंडो या शीर्ष-स्तरीय दृश्य होगा, और बस तालिका दृश्य के बारे में जानें। जो भी आप स्वयं करते हैं, आपको रिलीज़ करना होगा। –

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