LLVM संकलक 3.0 द्वारा प्रस्तुत चार नए स्वामित्व क्वालिफायर: __strong
, __autoreleasing
, __unsafe_unretained
, और __weak
। पहले तीन विनिर्देश के अनुसार, एआरसी के बाहर भी उपलब्ध हैं ।
जैसा कि यहोशू इंगित करता है, डिफ़ॉल्ट रूप से सभी संकेत __strong
एआरसी के तहत निहित हैं । इसका मतलब यह है कि जब किसी वस्तु को उस पॉइंटर को सौंपा जाता है, तो उसे उतने समय तक रखा जाता है, जब तक कि पॉइंटर उसे संदर्भित करता है। यह ज्यादातर चीजों के लिए ठीक है, लेकिन यह चक्र को बनाए रखने की संभावना को खोलता है, जैसा कि मैं यहां अपने जवाब में बताता हूं । उदाहरण के लिए, यदि आपके पास एक ऑब्जेक्ट है जिसमें उदाहरण चर के रूप में एक और ऑब्जेक्ट है, लेकिन उस दूसरी वस्तु के पास पहले वाले के रूप में एक मजबूत लिंक है, तो उसके दो ऑब्जेक्ट कभी भी जारी नहीं किए जाएंगे।
यही कारण है कि के लिए है __unsafe_unretained
और __weak
क्वालिफायर मौजूद हैं। उनका सबसे आम उपयोग प्रतिनिधियों के लिए है, जहां आप उस प्रतिनिधि के लिए एक संपत्ति को परिभाषित करेंगे जिसके साथ weak
या unsafe_unretained
विशेषता ( assign
प्रभावी रूप से unsafe_unretained
) है, और फिर संबंधित उदाहरण चर को चिह्नित करके __weak
या उसके साथ मिलान करें __unsafe_unretained
। इसका मतलब यह है कि प्रतिनिधि उदाहरण चर अभी भी पहली वस्तु पर वापस इंगित करेगा, लेकिन यह उस वस्तु को बनाए रखने का कारण नहीं होगा, इस प्रकार बनाए चक्र को तोड़ने और दोनों वस्तुओं को जारी करने की अनुमति देगा।
प्रतिनिधियों से परे, यह आपके कोड में बनने वाले किसी भी अन्य बनाए रखने वाले चक्र को तोड़ने के लिए उपयोगी है। सहायक रूप से, लीक्स इंस्ट्रूमेंट में अब एक साइकल दृश्य शामिल है, जो एक चक्रव्यू तरीके से आपके आवेदन में पता लगाने वाले चक्रों को बनाए रखता है।
दोनों __unsafe_unretained
और __weak
वस्तुओं की अवधारण को रोकते हैं, लेकिन थोड़े अलग तरीके से। के लिए __weak
, किसी ऑब्जेक्ट का पॉइंटर, उस ऑब्जेक्ट nil
के डिक्लरेशन पर कन्वर्ट हो जाएगा जो उसे इंगित करता है, जो बहुत ही सुरक्षित व्यवहार है। जैसा कि इसके नाम का तात्पर्य है, __unsafe_unretained
स्मृति को इंगित करना जारी रखेगा जहां एक वस्तु थी, तब भी जब उसे हटा दिया गया था। इससे उस ऑब्जेक्ट को एक्सेस करने की वजह से क्रैश हो सकता है।
आप कभी क्यों इस्तेमाल करेंगे __unsafe_unretained
? दुर्भाग्य से, __weak
तैनाती के लक्ष्य के रूप में केवल iOS 5.0 और लायन के लिए समर्थित है। यदि आप iOS 4.0 और स्नो लेपर्ड पर वापस लक्षित करना चाहते हैं, तो आपको __unsafe_unretained
क्वालिफायर का उपयोग करना होगा , या माइक ऐश के MAZeroingWeakRef जैसी किसी चीज़ का उपयोग करना होगा ।
__unsafe_unretained
सेNSString
स्थिरांक के सी सरणियों को परिभाषित करने के लिए उपयोगी हो सकता है और जैसे,NSString __unsafe_unretained *myStrings = { @"Foo", @"Bar", @"Baz", nil };