2011-04-02 20 views
11

मुझे इस मुद्दे पर प्रलेखन अस्पष्ट होने के लिए मिलता है:यदि आपके पास आईबीओलेट है, लेकिन संपत्ति नहीं है, तो क्या यह बरकरार है या नहीं?

कहें कि आप आईओएस के साथ काम कर रहे हैं (मैक केस नहीं, मतभेदों का उल्लेख करने की कोई आवश्यकता नहीं है)। मान लें कि यह सख्ती से 4.0+ है (पुराने ओएस में अंतर का उल्लेख करने की आवश्यकता नहीं है)। मान लें कि हम एनआईबी को सख्ती से स्वचालित रूप से लोड कर रहे हैं।

कहें कि आपके पास UIViewController, BigView है। कहें एनआईबी फ़ाइल में एक दर्जन तथाकथित "शीर्ष-स्तरीय" आइटम हैं ... कस्टम नियंत्रण, छवियां, या कुछ भी हो सकता है।

कहें कि आप निश्चित रूप से स्पष्ट रूप से निर्माण करने जा रहे हैं और फिर ऐप के चलाने के दौरान बिगव्यू से कई बार छुटकारा पाएं। तो:

(1) आप IBOutlet किसी भी प्रकार का इसके लिए, बिल्कुल नहीं है:

निब में इन शीर्ष-स्तरीय वस्तुओं में से एक के लिए, वहाँ तीन संभावनाएं हैं।

(2) आपके पास एक कनेक्टेड आईबीओलेट है - लेकिन संपत्ति नहीं है।

(3) आपके पास एक जुड़ा हुआ आईबीओलेट संपत्ति है (भ्रम से बचने के लिए, हम एक बरकरार संपत्ति कहेंगे)।

तो बिग व्यू जारी होने पर आइटम के साथ क्या होता है?

(3) के मामले में यह स्पष्ट है कि आपको स्पष्ट रूप से रिलीज़ करना होगा। यदि आप नहीं करते हैं, तो दृश्य समाप्त होने के बाद यह चारों ओर लटका होगा। कोई बात नहीं।

(1) के मामले में मुझे लगता है (लेकिन किसी को भी वास्तव में इस बात की पुष्टि कर सकते हैं?) है कि आइटम जब BigView चला गया है जारी किया जाएगा।

की (2) मामले यह स्पष्ट नहीं है कि क्या होता है में .......

प्रसिद्ध संदर्भ लिंक को देखते हुए: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html यह बहुत संदिग्ध है:

"में आईओएस, nib-loading कोड setValue का उपयोग करता है: forKey: प्रत्येक आउटलेट को फिर से कनेक्ट करने के लिए विधि। यह विधि समान रूप से उचित एक्सेसर विधि की तलाश करती है और [इसलिए क्या होता है यदि कोई नहीं है ?? हमें बताएं ...] वापस आ जाता है अन्य माध्यमों पर जब यह विफल हो जाता है ... [अच्छा ग्रिफ!] "

और इस दस्तावेज़ को देखें: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html और करने के लिए "नोक वस्तु प्रतिधारण"

तो नीचे स्क्रॉल ...

"निब फ़ाइल में वस्तुओं 1 की गिनती को बनाए रखने के साथ बनाया जाता है और उसके बाद autoreleased" बढ़िया ..

लेकिन रुकिए! में कुछ शब्द पर पढ़ें ...

हालांकि, ... जो उपलब्ध सेटर विधि का उपयोग करता है या डिफ़ॉल्ट रूप से वस्तु को बरकरार रखे हुए है, तो कोई सेटर विधि उपलब्ध है

क्या वे के बारे में बात कर रहे हैं?

वे मतलब है कि अगर कोई सेटर उपलब्ध (इवर, लेकिन कोई संपत्ति), यह फिर कायम ("बनाए रखने" के अलावा अन्य वे सिर्फ पिछले खंड में उल्लेख) --- या है कि है, वे कर रहे हैं क्या बस खुद को दोहराएं, यानी "डिफ़ॉल्ट रूप से ऑब्जेक्ट को बरकरार रखता है" वही "बनाए रखना" है, वे तुरंत पहले ("1 की एक गिनती गिनती के साथ बनाए गए और फिर ऑटोरेलेज्ड" के साथ बात कर रहे थे)।

और यदि ऐसा नहीं होता है तो वे ऑटोरेलीज़ का भी उल्लेख क्यों करेंगे?

दरअसल - अगर कोई वास्तव में विशेष रूप से इस प्रश्न का उत्तर जानता है ...... आप कैसे जानते हैं?! क्या आपने डीटीएस, या परीक्षण के माध्यम से पूछा था, या? मेरा सुझाव है, मुख्य दस्तावेज (केवल चिपकाया गया) आक्रामक रूप से अस्पष्ट है।

फिर से - अगर आप एक IBOutlet, लेकिन एक संपत्ति, एक "उच्च-स्तरीय" वस्तु .. आप इसे जारी करने के लिए जिम्मेदार हैं से कनेक्ट नहीं? क्या यह बरकरार है? उस स्थिति में?

उस मामले के लिए .... केवल स्थिति में (1) क्या यह बिल्कुल मामला है कि BigView दूर जाने पर चीज़ जारी की जाएगी? मैं निश्चित रूप से यह मानता हूं कि यह मामला है, लेकिन कौन जानता है?

सवाल,

मैं गया है मूर्खता कभी नहीं इस बारे में पहले/बहुत ज्यादा मान लिया सोचा अगर आप एक IBOutlet इवर प्रयोग करते हैं कि क्या होता है, लेकिन नहीं एक संपत्ति है ... किसी को भी करता निर्णायक जवाब है? चीयर्स !!


रिकॉर्ड के लिए मैंने एक परीक्षण परियोजना बनाई है।

वास्तव में (आश्चर्यजनक रूप से मेरे लिए) आईबी तत्व को आईबी तत्व से जोड़ने का एकमात्र कार्य वास्तव में स्पष्ट रूप से को बनाए रखता है।

(मैं केवल घटिया दस्तावेज से यह मान सकते हैं, उस स्थिति में आप विशेष रूप से मिलता है:। रखें, autorelease, को बनाये रखें - अग्रणी एक संतुलन पर बनाए रखने के लिए)

तो, कि इसका जवाब है।

मैं डेमो प्रोजेक्ट पोस्ट करूंगा। मैं किसी भी पाठकों को जोना के उत्तर में भी निर्देशित करता हूं जो निर्दोष रूप से सेटवैल्यू के व्यवहार को समझाता है: के लिए: चीयर्स

+0

आपको बहुत बहुत धन्यवाद। मैं बिल्कुल वही प्रश्न सोच रहा था! मैं सेब डॉक्स पढ़ने के बाद इतना उलझन में था इसलिए मैं पूरी तरह से अनिश्चित था कि इसमें क्या विश्वास करना है और इस स्पष्टीकरण के लिए योना को भी धन्यवाद। – Buju

+0

यह एक अजीब है हू - मैं आपसे सहमत हूं। अप-वोट के लिए धन्यवाद क्योंकि इसने मुझे "सुपर-पावर पावर" या इस साइट पर कुछ दिया !!! मैं दुनिया का राजा हूँ !!! – Fattie

उत्तर

11

मैं क्या इतना भ्रम का कारण बनता नहीं दिख रहा से संपर्क करना चाहिए, मैं "नोक वस्तु प्रतिधारण" प्रलेखन वास्तव में क्या होता है बताते हैं लगता है। आइए इसे तोड़ दें और क्या होता है इसके माध्यम से चलें:

निब फ़ाइल में ऑब्जेक्ट्स 1 की बरकरार गिनती के साथ बनाए जाते हैं और फिर ऑटोरेलेज्ड होते हैं। forKey:

ClassLoadedFromNib *loadedObject = [[[ClassLoadedFromNib alloc] initWithCoder:coder] autorelease]; 

यह वस्तु पदानुक्रम पुनर्निर्माण के रूप में, हालांकि, UIKit setValue का उपयोग कर वस्तुओं के बीच कनेक्शन reestablishes विधि,

[filesOwner setValue:loadedObject forKey:nameOfIBOutlet]; 

जो ava का उपयोग करता है इलटेबल सेटर विधि या यदि कोई सेटर विधि उपलब्ध नहीं है तो ऑब्जेक्ट को डिफॉल्ट रूप से बरकरार रखता है।

आईओएस में -setValue:forKey: के डिफ़ॉल्ट व्यवहार को मोटे तौर पर

//lazy pseudocode 
if ([self respondsToSelector:@selector(@"setKeyName:")]) { 
    [self setKeyName:value]; 
} 
else { 
    object_setIvar(self, _keyName, [value retain]); 
} 

भी अधिक विस्तार के लिए कुंजी-मान प्रोग्रामिंग मार्गदर्शिका देखें है। जब तक आपकी फ़ाइल का स्वामी ऑब्जेक्ट -setValue:forKey: (या +accessInstanceVariablesDirectly और -setValue:forUndefinedKey:) ओवरराइड नहीं करता है, तो ऑब्जेक्ट स्वामित्व को ऊपर के रूप में प्रबंधित करने की अपेक्षा करें।


आप निब-फ़ाइल वस्तुओं के लिए दुकानों को परिभाषित, तो आप हमेशा कि आउटलेट पहुँचने के लिए एक सेटर विधि (या घोषित संपत्ति) को परिभाषित करना चाहिए। आउटलेट के लिए सेटर विधियों को अपने मूल्यों को बनाए रखना चाहिए, और शीर्ष-स्तरीय ऑब्जेक्ट वाले आउटलेट के लिए सेटटर विधियों को उनके मानों को बरकरार रखने से रोकने के लिए बनाए रखना चाहिए।

आईवर को सीधे बाहरी रूप से बनाए रखने वाली वस्तुओं पर सेट करने के लिए निब लोडिंग की अनुमति देना भ्रमित है। ऐसा मत करो। अपने आउटलेट के लिए सेटटर विधियां प्रदान करें ताकि लोड ऑब्जेक्ट का स्वामित्व स्पष्ट हो।


आप दुकानों में शीर्ष स्तर के वस्तुओं की दुकान नहीं है, तो आप या तो सरणी loadNibNamed द्वारा वापस होना आवश्यक है: मालिक: विकल्प: विधि या सरणी के अंदर वस्तुओं होने से उन वस्तुओं को रोकने के लिए समय से पहले जारी किया गया।

आउटलेट से जुड़े ऑब्जेक्ट्स को ऑटोरेलेटेड नहीं किया गया है।उन्हें बनाए रखें या सरणी से लौटाए गए सरणी नाम: मालिक: विकल्प: यदि आप बाद में उन तक पहुंचने का प्रयास करने जा रहे हैं।

+0

हे जोने - संक्षेप में, यह सेटवैल्यू का एक शानदार स्पष्टीकरण है: forKey: व्यवहार, धन्यवाद। (डॉको बुरी तरह से त्रुटिपूर्ण है क्योंकि मैं लंबाई में वर्णन करता हूं ... तुम्हारे बिना हम भरे हुए होंगे।) चीयर्स! – Fattie

2

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

+0

मैंने डीवी नहीं किया, लेकिन निश्चित रूप से आपको केवल कुछ आउटलेट बनाने की ज़रूरत है यदि आईबी को इसे देखने की ज़रूरत है और केवल एक संपत्ति है यदि आप गेटर्स/सेटर्स चाहते हैं? –

+0

यदि आपको आउटलेट की आवश्यकता है, तो ऐसा इसलिए है क्योंकि आप निब फ़ाइल से बनाए गए किसी चीज़ को संदर्भित करने की योजना बनाते हैं। उस संदर्भ को प्रबंधित करने के लिए किसी संपत्ति का उपयोग ऊपर उठाए गए प्रश्नों से बचाता है, और स्मृति प्रबंधन को भी आसान बनाता है। निश्चित रूप से, आप सीधे ivar का उपयोग कर सकते हैं, लेकिन यह किसी भी संपत्ति के बारे में सच है। हो सकता है कि आप का मतलब है कि आप केवल एक संपत्ति का उपयोग कर सकते हैं जब आप संबंधित मूल्य को बदलने के लिए स्वयं के अलावा अन्य वस्तुओं के लिए इरादा रखते हैं, लेकिन यह वही होता है जब आप एक निब से ऑब्जेक्ट लोड करते हैं। – Caleb

+0

@ जो ब्लो, मुझे लगता है कि यह एक दिलचस्प सवाल है, लेकिन चूंकि इस तरह के विषय शुरुआती भ्रमित करते हैं, इसलिए मैं वहां सबसे अच्छा व्यावहारिक समाधान रखना चाहता था। मुझे पता है कि मैंने जो पोस्ट किया है वह वह उत्तर नहीं है जिसे आप ढूंढ रहे थे, और अगर कोई इस कारण से इस जवाब को वोट देता है तो यह ठीक है। – Caleb

0

केस 1) यदि वस्तु किसी भी चीज से नहीं बरकरार रखी जाती है तो इसे अगले ऑटोरेलीज पूल नाली पर हटा दिया जाएगा।

केस 2) उत्तर में दिए गए उत्तर में जॉन हेस ने पहले ही इस मामले के लिए मैक ओएस एक्स और आईओएस के बीच अंतर (दस्तावेज़ीकरण के संदर्भ में) का वर्णन किया है।

जॉन हेस सही है या फ्रीमैन सही है?

आईओएस मामले में हेस और फ्रीमैन कहते हैं कि ऑब्जेक्ट बनाए रखा जाएगा। इस पर उनके बीच कोई विरोधाभास नहीं है।

यह अभी भी अत्यधिक सभी आउटलेट्स के लिए सेटर तरीकों की सिफारिश की है:

Resource Programming Guide, Nib Files

यदि आप निब-फ़ाइल वस्तुओं के लिए दुकानों को परिभाषित, आप हमेशा एक सेटर विधि परिभाषित करना चाहिए (या घोषित संपत्ति) उस आउटलेट तक पहुंचने के लिए। दुकानों के लिए सेटर तरीकों उनके मूल्यों ...

+0

हां, यह बरकरार रखा गया है और जब आप इसके साथ काम करते हैं तो आपको इसे रिलीज़ करना चाहिए (आमतौर पर 'dealloc' में)। असल में मैंने इस दृष्टिकोण का अतीत में उपयोग किया लेकिन अब मैं इसके लिए गुणों का उपयोग करता हूं क्योंकि यह मेरे कोड के भविष्य के रखरखाव के लिए कम भ्रमित है। – hoha

+0

हाय होहा। आपके मार्गदर्शन के लिए धन्यवाद। वास्तव में मैंने एक परीक्षण परियोजना बनाई और यह स्थिति साबित करता है। मैं इसे पोस्ट करूंगा। मैं बहुत हैरान था कि आईबी तत्व को आईबीओलेट में जोड़ने का केवल एक तथ्य वास्तव में एक को बनाए रखता है। धन्यवाद फिर से और जयकार! क्षमा करें कुछ बेवकूफ ने आपकी टिप्पणी को वोट दिया! – Fattie

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

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