एआरसी - __unsafe_unretain का अर्थ?


80

बस यह सुनिश्चित करना चाहता हूं कि मुझे यह सही लगे:

  1. क्या मुझे उन __unsafe_unretainवस्तुओं की आवश्यकता है जो मेरे पास नहीं हैं?
  2. एक वस्तु है, तो __unsafe_unretainedक्या मुझे उपयोग करने की आवश्यकता assignमें @property? क्या इसका मतलब यह है कि ऑब्जेक्ट को बरकरार नहीं रखा गया है, और बस उस ऑब्जेक्ट को संदर्भित करता है जिसे मैं असाइन करता हूं?
  3. मैं प्रतिनिधियों को छोड़कर इसका उपयोग कब करना चाहूंगा?
  4. क्या वह ARC चीज है या पहले उपयोग में थी?

जवाबों:


192

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 जैसी किसी चीज़ का उपयोग करना होगा


2
और निश्चित रूप __unsafe_unretainedसे NSStringस्थिरांक के सी सरणियों को परिभाषित करने के लिए उपयोगी हो सकता है और जैसे,NSString __unsafe_unretained *myStrings = { @"Foo", @"Bar", @"Baz", nil };
jlehr

2
@ शन्नोगा - नहीं, आपको __weakउन प्रकार के संकेत का उपयोग करने के लिए मैन्युअल रूप से इसे एक योग्यताकर्ता के रूप में निर्दिष्ट करना होगा । आप अभी भी __unsafe_unretainedविशुद्ध रूप से 5.0 लक्ष्य के साथ उपयोग कर सकते हैं और यह ऐसा व्यवहार नहीं करेगा __weak। : यदि आप कुछ है कि अपने लक्ष्य यह समर्थन करता है, तो आप एक संकलक विशिष्ट इस्तेमाल कर सकते हैं, इस आधार पर दो मोड के बीच स्विच की तरह मैं यहाँ का सुझाव परिभाषित चाहते हैं stackoverflow.com/a/8594878/19679
ब्रैड लार्सन

4
@ जेलेहर - NSString *myStrings = { @"Foo", @"Bar" };वैध उद्देश्य-सी सिंटैक्स नहीं है; @"Foo"अपने आप टाइप NSString*होता है। शायद आपका मतलब था NSString *myStrings[] = { @"Foo", @"Bar" };, लेकिन उस मामले में मुझे वास्तव में समझ में नहीं आता है कि __unsafe_unretainedविशेष रूप से उपयोगी कैसे होगा।
क्क्सप्लसोन जूल

2
@Quuxplusone दोनों मामलों में सही - मैं स्ट्रक्चर्स के साथ सी सरणियों को मिला रहा था। मुझे जो कहना चाहिए था वह यह __unsafe_unretainedहो सकता है कि उपयोगी C संरचना सदस्य ऐसे हो सकते हैं जो NSString स्थिरांक को इंगित करते हैं, जैसेstruct foo { __unsafe_unretained NSString * const s; int x; };
jlehr

1
इसके भी निहितार्थ हैं Class। देखें: stackoverflow.com/a/14245894/392847
क्विंटन विलीसन

4
  1. नहीं, आप उन weakवस्तुओं के लिए भी उपयोग कर सकते हैं जो आपके पास नहीं हैं।
  2. नहीं, आप unsafe_unretainedसंपत्ति पर भी उपयोग कर सकते हैं।
  3. मेरी समझ यह है कि unsafe_unretainedआइटम वैसे ही होते हैं weak, जैसे उन्हें साफ करने की अतिरिक्त सुरक्षा के बिना जब वह आइटम जारी करने के लिए इंगित करता है (और इसके साथ जाने वाला ओवरहेड)।
  4. यह पूरी तरह से एक एआरसी बात है।

दरअसल, अजीब तरह से पर्याप्त, unsafe_unretainediVars, जब रनटाइम पर सेट किया जाता है, तो बस strongलोगों की तरह व्यवहार करते हैं, जो मुझे विश्वास दिलाता है कि unsafe_unretainedबस एक संकलक संकेत है, जबकि कमजोर नहीं है। यहाँ अधिक जानकारी: stackoverflow.com/questions/11621028/…
रिचर्ड जे। रॉस III

4

__unsafe_unretainedARC से पहले किसी वस्तु का डिफ़ॉल्ट भंडारण के समान है। एआरसी के साथ डिफ़ॉल्ट अब __strongअर्थ है कि आपके पास इसका संदर्भ है जब तक कि आपका संदर्भ दायरे से बाहर नहीं जाता है।


1

__Unsafe_unretain पर एक और अवलोकन: मुझे डिवाइस पर मेरे ऐप में क्रैश मिला है और __unsafe_unretain के रूप में घोषित किए गए iVars के साथ सिम्युलेटर पर नहीं ! हां, यह एआरसी माइग्रेशन से कोड में एक बग था, लेकिन यह पहली बार था जब मैंने डिवाइस और सिम्युलेटर के बीच ऐसा अंतर देखा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.