शब्द 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
गुण, जैसे ** जो इसका मतलब है कि वे सही काम कर रहे थे। एआरसी के तहत संकलित होने पर एक ही घोषणा शायद गलत बात बन जाती है।
सारांश में: IBOutlet
weak
में अनुवाद नहीं करता, लेकिन यह सूचक का अर्थ बदल नहीं करता है। डिफ़ॉल्ट स्मृति प्रबंधन एमआरआर के तहत "आवंटित" से IBOutlet UIButton * button;
परिवर्तन के शब्दों के बाद से "स्वामित्व" के लिए एआरसी के तहत, और के बाद से IBOutlet
रों आम तौर पर गैर-मालिक होना चाहिए, IBOutlet
की उपस्थिति वास्तव में मतलब है कि सूचक के तहत __weak
घोषित किया जाना चाहिए करता है एआरसी।
* और एक weak
संपत्ति के समान † - फर्क सिर्फ इतना है कि weak
संकेत nil
की तैयारी में हैं जब वस्तु पुनः आवंटित की जाती रही है।
** ऑटो- nil
भाग के अलावा।
† या, वास्तव में, यह weak
संपत्ति होना चाहिए।
धन्यवाद, यह अब और अधिक स्पष्ट है। लेकिन एक बात जो मैं उलझन में हूं, वह है: यहां तक कि अगर मैं स्पष्ट रूप से आईबीओलेट को __weak के रूप में परिभाषित नहीं करता हूं (इस मामले में यह मजबूत होगा), क्या एआरसी इसका ख्याल नहीं रखेगा? जब तक कोई चक्र नहीं रहता है (और कोई भी नहीं है), सब कुछ ख्याल रखा जाता है, नहीं? – 0xSina
एआरसी जो भी करता है वह करना जारी रखेगा, इसलिए, हाँ, जब तक आप चक्र बनाए रखने से बचें, एक 'मजबूत' 'आईबीओलेट' भी काम करेगा। –