2012-04-25 10 views
6

बस एआरसी के साथ शुरू करना। प्री-एआरसी, मैं बस अपने आउटलेट्स को उदाहरण के लिए घोषित करता हूं उदाहरण के लिए: IBOutlet UIButton *button; इसलिए मैं इसे या कुछ भी बरकरार नहीं रख रहा हूं। एआरसी के साथ, कमजोर या मजबूत निर्दिष्ट नहीं है मजबूत है।क्या आईबीओलेट ने __weak का संकेत दिया है?

तो अगर मैं एआरसी (यानी IBOutlet UIButton *button;) के तहत एक ही काम करता हूं, तो क्या इसका मतलब बटन एक मजबूत संदर्भ है? या क्या मुझे विसंगति को कमजोर परिभाषित करना है?

संक्षेप में, IBOutlet मतलब __weak?

उत्तर

16

शब्द IBOutlet वास्तव में कुछ भी नहीं के रूप में परिभाषित किया गया है इंटरफेस बिल्डर में कनेक्शन बनाने की अनुमति देने के प्रयोजनों के लिए आपका कोड। एक IBOutlet के रूप में एक चर का एक घोषणा या एक संपत्ति:

IBOutlet UIButton * button; 
@property (...) IBOutlet UIButton * button; 

इसलिए किसी भी सीधा प्रभाव जहाँ तक एआरसी का संबंध है नहीं है; यह (हालांकि, अनुमानतः, यह कर सकता है) __weak या उस तरह कुछ भी अनुवाद नहीं करता है। जब संकलक इसे प्राप्त करता है तब तक शब्द पूरी तरह से आपके स्रोत से चला जाता है।

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

एआरसी के तहत IBOutlet UIButton * button; की तरह एक वस्तु चर घोषणा के लिए अंतर्निहित भंडारण क्वालीफायर, __strong है के रूप में आप ने कहा - चर करने के लिए आवंटित किसी भी वस्तु "स्वामित्व" विचार किया जाएगा। एमआरआर के तहत, घोषणा सिर्फ एक सूचक है; असाइन किए गए ऑब्जेक्ट की संदर्भ गणना/स्वामित्व पर कोई प्रभाव नहीं पड़ता है - यह assign संपत्ति के समान कार्य करता है। * इसलिए दो प्रबंधन प्रणालियों के बीच एक ही इवर घोषणा का अर्थ बदलता है।

एक xib में ऑब्जेक्ट्स के स्वामित्व/मालिक संबंध हैं जो दृश्य पदानुक्रम द्वारा गठित होते हैं; यही है, माता-पिता के विचार उनके सबव्यूज हैं। Xib में शीर्ष-स्तरीय दृश्य उस ऑब्जेक्ट के स्वामित्व में है जिसे फ़ाइल के स्वामी के नाम से जाना जाता है।इस सेटअप का मतलब है कि, आमतौर पर, आपके आउटलेट्स को xib में ऑब्जेक्ट्स के लिए शीर्ष-स्तर weak (एआरसी के तहत) या assign (यदि एमआरआर के तहत कोई संपत्ति हो) होनी चाहिए। वे संबंधों का मालिक नहीं हैं; वे दृश्य सूची में अनिवार्य रूप से सुविधाजनक अनुक्रमणिका हैं। यह Apple's recommendation है:

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

[...] आउटलेट आमतौर पर weak होना चाहिए, फाइल के मालिक से उनको निब फ़ाइल (या, आईओएस, एक स्टोरीबोर्ड दृश्य) में छोड़कर strong होना चाहिए। दुकानों कि आप पैदा करेगा [वैसा] इसलिए आम तौर पर weak डिफ़ॉल्ट रूप से होना चाहिए ...

आपका सरल सूचक IBOutlet रों, जैसा कि मैंने बताया गया है, में काम किया - स्मृति प्रबंधन प्रयोजनों के लिए - weak गुण, जैसे ** जो इसका मतलब है कि वे सही काम कर रहे थे। एआरसी के तहत संकलित होने पर एक ही घोषणा शायद गलत बात बन जाती है।

सारांश में: IBOutletweak में अनुवाद नहीं करता, लेकिन यह सूचक का अर्थ बदल नहीं करता है। डिफ़ॉल्ट स्मृति प्रबंधन एमआरआर के तहत "आवंटित" से IBOutlet UIButton * button; परिवर्तन के शब्दों के बाद से "स्वामित्व" के लिए एआरसी के तहत, और के बाद से IBOutlet रों आम तौर पर गैर-मालिक होना चाहिए, IBOutlet की उपस्थिति वास्तव में मतलब है कि सूचक के तहत __weak घोषित किया जाना चाहिए करता है एआरसी।


* और एक weak संपत्ति के समान † - फर्क सिर्फ इतना है कि weak संकेत nil की तैयारी में हैं जब वस्तु पुनः आवंटित की जाती रही है।

** ऑटो- nil भाग के अलावा।

या, वास्तव में, यह weak संपत्ति होना चाहिए।

+0

धन्यवाद, यह अब और अधिक स्पष्ट है। लेकिन एक बात जो मैं उलझन में हूं, वह है: यहां तक ​​कि अगर मैं स्पष्ट रूप से आईबीओलेट को __weak के रूप में परिभाषित नहीं करता हूं (इस मामले में यह मजबूत होगा), क्या एआरसी इसका ख्याल नहीं रखेगा? जब तक कोई चक्र नहीं रहता है (और कोई भी नहीं है), सब कुछ ख्याल रखा जाता है, नहीं? – 0xSina

+0

एआरसी जो भी करता है वह करना जारी रखेगा, इसलिए, हाँ, जब तक आप चक्र बनाए रखने से बचें, एक 'मजबूत' 'आईबीओलेट' भी काम करेगा। –

3

IBOutlet कीवर्ड केवल इंटरफ़ेस बिल्डर में एक तत्व के साथ वस्तु संबद्ध करने के लिए प्रयोग किया जाता है है। इसका कमजोर या मजबूत या एआरसी या मेमोरी प्रबंधन से कोई लेना-देना नहीं है।

+0

यह बेतुका है; 'IBOutlets' के मेमोरी प्रबंधन को किसी भी अन्य चर के प्रबंधन के रूप में माना जाना चाहिए। –

+2

@JacquesCousteau वास्तव में नहीं, उसका जवाब सावधानीपूर्वक पढ़ें, आईबीओलेट कुंजीशब्द, मौसम के साथ कुछ लेना देना नहीं है, संपत्ति को मजबूत या कमजोर के रूप में सेट किया जाएगा। उन्होंने जो कहा वह 100% सटीक है। भले ही आप उस ऑब्जेक्ट मेमोरी को प्रबंधित करने का निर्णय लेते हैं। – Pochi

+0

आईबीओलेट के साथ एक संपत्ति को प्रबंधित करने की आवश्यकता होगी क्योंकि आप किसी अन्य संपत्ति का प्रबंधन करेंगे, लेकिन आईबीऑलेट इसमें कारक नहीं है। – bbarnhart

4

नहीं, कोड संकलित होने पर आईबीओलेटलेट मूल रूप से छीन लिया जाता है। हालांकि यह एक्सकोड के लिए एक सहायक है ताकि यह जान सके कि इंटरफेसबिल्डर ऑटलेट क्या है।

असल में यह शब्द आपको इंटरफेस बिल्डर में तत्व को जोड़ने देगा।

डिफ़ॉल्ट रूप से यह अभी भी मजबूत होगा (बस कल्पना करें कि शब्द वहां नहीं है)।

हालांकि यह सुझाव दिया जाता है कि आप इसे कमजोर बनाते हैं क्योंकि एक बार इंटरफ़ेस बिल्डर से कुछ जुड़ा हुआ है, तो इंटरफ़ेस इसके लिए एक मजबूत संदर्भ रखेगा, इसलिए डबल मजबूत संदर्भ होने पर कोई बात नहीं है, खासकर यदि वह तत्व इंटरफ़ेस को अनलोड किए जाने पर जीवित रहने के लिए नहीं है।

इस सवाल है जो वास्तव में क्या आप देख रहे हैं पढ़ें:

#define IBOutlet 

Xcode बस में इस शब्द की उपस्थिति का उपयोग करता है:

Should IBOutlets be strong or weak under ARC?

+1

क्या मुझे अपनी आईबीओलेट को संपत्ति के रूप में घोषित करना है? – 0xSina

+0

नहीं, आप बस उन्हें आवृत्ति चर के रूप में घोषित नहीं कर सकते हैं, यदि आप इसे मैकोज़ पर करते हैं तो एक अंतर होता है, आप इसके बारे में यहां और अधिक पढ़ सकते हैं: http://stackoverflow.com/questions/1221516/does-an-iboutlet -निड्स-टू-ए-ए-प्रॉपर्टी-संश्लेषित – Pochi

+1

ठीक है और यदि मैं उन्हें आवृत्ति चर के रूप में घोषित करता हूं, तो यह सबसे अच्छा होगा: __weak IBOutlet UIButton * बटन, है ना? – 0xSina

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