2013-02-07 59 views
6

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

मान लें कि मैं UILabel को नियंत्रक (आईबी का उपयोग करके) जोड़ना चाहता हूं।

@property (nonatomic, weak) IBOutlet UILabel * label; 

और मैं * .m फ़ाइल में कुछ और करने की जरूरत नहीं है: मैं मैं ज फ़ाइल * कुछ इस तरह होगा। लेकिन अगर मैं * .xib फ़ाइल को हटाने और स्थापना के लिए मेरी UILabel में,, init तरीकों में से एक है, इस तरह की कोशिश उदाहरण के लिए:

self.label = [[UILabel alloc] initWithFrame:CGRectMake(0,0,100,20)]; 
self.label.text = @"some text"; 
[self.view addSubview:self.label]; 

यह जब तक मैं इस के लिए मेरे * ज फ़ाइल को बदलने से काम नहीं करता :

@property (nonatomic, strong) UILabel * label; 

अब, मैं कमजोर और मजबूत के बीच का अंतर है, लेकिन मुझे पता नहीं क्यों हम UI तत्व के लिए कमजोर जब आईबी का उपयोग कर उपयोग कर सकते हैं? कुछ इन तत्वों के लिए एक मजबूत पॉइंटर्स रखना चाहिए, है ना? पर क्या?? दूसरे मामले में यह नियंत्रक है, लेकिन मुझे समझ में नहीं आता कि यह पहले मामले में कैसे व्यवहार करता है।

+0

मैं या तो क्यों// यह कमजोर होना चाहिए सकता है पता नहीं है। यह निश्चित रूप से मजबूत होने की जरूरत है। –

+0

जब आप आईबी का उपयोग नहीं करते हैं, तो यह आवश्यक है, यह मेरे सवाल का संकेत था "जब आप आईबी का उपयोग करते हैं तो मजबूत सूचक क्या रहता है?", क्योंकि यह नियंत्रक नहीं है, है ना? ;) –

+0

@ H2CO3 मेरा उत्तर में डॉक्स से मेरी बोली देखते हैं, विशेष रूप से, "दुकानों आपके द्वारा बनाए गए इसलिए आम तौर पर कमजोर होना चाहिए" स्पष्टीकरण के लिए – WDUK

उत्तर

2

कुछ को इन तत्वों के लिए एक मजबूत पॉइंटर्स रखना चाहिए, है ना? पर क्या??

सही, आपके पास मौजूद होने के लिए किसी ऑब्जेक्ट के कम से कम 1 मजबूत संदर्भ होना चाहिए। आपको यूआई की रूट लेवल ऑब्जेक्ट्स के लिए केवल एक मजबूत संदर्भ होना चाहिए, इससे कम कुछ भी कमजोर हो सकता है (क्योंकि मूल वस्तुएं उनके बच्चों के मालिक होंगी)। .xib फ़ाइल को इसके फाइल मालिक के साथ समन्वय में आपके लिए यह किया होगा।

this document on the workings of xib files देखें। विशेष रूप से, यह स्निपिट:

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

एक व्यावहारिक परिप्रेक्ष्य से, आईओएस और ओएस एक्स आउटलेट में घोषित गुणों के रूप में परिभाषित किया जाना चाहिए। दुकानों को आम तौर पर कमजोर होना चाहिए, फाइल के मालिक से उन लोगों को छोड़कर जिन्हें निब फ़ाइल में शीर्ष स्तर की ऑब्जेक्ट्स (या, आईओएस, एक स्टोरीबोर्ड दृश्य) में मजबूत होना चाहिए। दुकानों आपके द्वारा बनाए गए इसलिए आम तौर पर कमजोर होना चाहिए

+0

आपको बहुत बहुत धन्यवाद, यह था ज्ञान का हिस्सा मैं अब तक लापता था। आपका बहुत बहुत धन्यवाद! –

+0

'यूआईएनआईबी' के पास उन वस्तुओं को स्वामित्व नहीं है जो इसे तुरंत करने के बाद बनाए गए हैं। –

+2

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

4

कारण है कि इंटरफ़ेस बिल्डर IBOutlets के लिए कमजोर संदर्भ बनाता है इस प्रकार है:

आईबी को पता है कि एक दृश्य के अपने superview द्वारा बनाए रखा है। तो विचारों के पेड़ में किसी वस्तु को मूल वस्तु के अलावा मजबूत संदर्भ रखने की आवश्यकता नहीं है। व्यू कंट्रोलर इस मजबूत संदर्भ को अपनी मुख्य view संपत्ति में रखता है।

अब जब दृश्य अनलोड किए गए (कम से कम आईओएस 5 तक), UIViewController की view संपत्ति मुख्य दृश्य को जारी करने के लिए शून्य पर सेट है। यदि इस पर्यवेक्षण के सबव्यूज के लिए आईबीओटलेट मजबूत संदर्भ होंगे तो वे स्मृति में दृश्य पदानुक्रम का हिस्सा बने रहेंगे। यह अवांछित है (और इन अनाथ विचारों तक पहुंचने पर संभवतः भ्रम पैदा कर सकता है)।

+1

ठीक है, अभी यह सब स्पष्ट है, बहुत बहुत धन्यवाद! –

+1

स्वीकार किए जाते हैं जवाब होना चाहिए: यह बहुत एप्पल को दस्तावेज़ की प्रतिलिपि अतीत की तुलना में अधिक स्पष्ट है ... – tiguero

1

स्वीकार किए जाते हैं जवाब के बावजूद, यह कैसे आप यह कोड में कर सकते हैं:

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0,0,100,20)]; // strong ref 
label.text = @"some text"; 
[self.view addSubview:label]; // strong ref from superview 
self.label = label; // weak ref 
// Now you can do `label = nil;` 

यह जब XIB से लोड हो रहा है बिंदु है। labelपहले से ही superview जब वह अपने कमजोर संपत्ति को असाइन किया गया है।

+0

इस होनहार लग रहा है, मैं इसे बाहर की जाँच करना होगा, धन्यवाद –