2011-10-17 33 views
5

मुझे यह जांचने में सक्षम होना चाहिए कि क्या मैंने उद्देश्य-सी में पहले से ही एक चर जारी किया है। मैं जांच का प्रयास करता है, तो यह शून्य करने के लिए बदल:मैं कैसे जांच सकता हूं कि कोई ऑब्जेक्ट जारी किया गया है या नहीं?

//Checks if buildview is null and returns respective output 
if(BuildView == NULL) 
    NSLog(@"Build View Value (pointer): Null"); 
else 
    NSLog(@"Build View Value (pointer): Not Null"); 

//allocates memory and initalizes value 
BuildView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)]; 

//Checks if buildview is null and returns respective output again 
if(BuildView == NULL) 
    NSLog(@"Build View Value (pointer): Null"); 
else 
    NSLog(@"Build View Value (pointer): Not Null"); 

//Releases the view 
[BuildView release]; 

//Checks if buildview is null and returns respective output again 
if(BuildView == NULL) 
    NSLog(@"Build View Value (pointer): Null"); 
else 
    NSLog(@"Build View Value (pointer): Not Null"); 

परिणाम थे:

Build View Value (pointer): Null 
Build View Value (pointer): Not Null 
Build View Value (pointer): Not Null 

वहाँ अगर यह पुनः आवंटित की जाती है की जाँच करने के लिए किसी भी आसान रास्ता नहीं है?

+0

क्या आप पूछ हो रहे हैं, तो वस्तु जारी की गई है नहीं है, बल्कि अगर यह पुनः आवंटित की जाती किया गया है। – PengOne

+1

संभावित डुप्लिकेट [कैसे निर्धारित किया जाए कि मेरे पास जारी ऑब्जेक्ट के लिए पॉइंटर है?] (Http://stackoverflow.com/questions/12280799/how-to-determine-if-i-have-a-pointer-to-released -object) – OrangeDog

उत्तर

4

शायद आप का मतलब है कि नष्ट (नष्ट), जारी नहीं किया गया। जारी होने के कारण का मतलब को अस्वीकार नहीं किया गया है, यह संदर्भ बिंदु बिंदु प्रबंधन की बात है। जारी होने के नाते एक राज्य नहीं है, आप इसकी जांच नहीं कर सकते; नष्ट किया जा रहा है।

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

एक तकनीक ऑब्जेक्ट को डेलोकेशन के दौरान अधिसूचना भेजना है, ताकि पॉइंटर रखने वाली हर चीज इसे शून्य पर रीसेट कर सके।

आम तौर पर, आपको अपने प्रोग्राम को इस तरह से डिजाइन करना होगा कि release पर कॉल करने के बाद आपको कोई ऑब्जेक्ट पॉइंटर का उपयोग नहीं किया जाए। आपके द्वारा दिए गए नमूना कोड में, आपको एक नया मान निर्दिष्ट करने के अलावा किसी अन्य चीज़ के लिए BuildView का उपयोग नहीं करना चाहिए।

+0

यह ध्यान दिया जाना चाहिए कि ऐतिहासिक उद्देश्यों के लिए, यह उत्तर अब सही नहीं है। उद्देश्य-सी में कमजोर संदर्भ हैं, और वास्तव में, यह हमेशा पर्याप्त रनटाइम हैकिंग के साथ किया जाता है। हालांकि, आधिकारिक संस्करण के लिए, उन्हें आईओएस 5 और अधिक की आवश्यकता होती है। –

6

आमतौर पर, आपको यह जांचने की आवश्यकता नहीं है कि कोई पॉइंटर एक विघटित वस्तु को इंगित करता है या नहीं: आपको पता होना चाहिए :) आपके चर बस एक मेमोरी पता रखें। यदि वेरिएबल की ओर इशारा करते हुए मेमोरी की सामग्री को हटा दिया गया है, तो आपके वैरिएबल का मूल्य (जो पता रखता है) जादुई रूप से शून्य या नल पर सेट नहीं किया जाएगा। तो आपको अपने डिज़ाइन पर पुनर्विचार करना चाहिए यदि आपको यह जांचना आवश्यक हो कि कोई सूचक पता स्थान पर इंगित कर सकता है कि पहले से ही जारी/हटा दिया गया है।

विकास के समय के दौरान, आप NSZombies सक्रिय करने जैसी चीजें कर सकते हैं या यह पता लगाने के लिए उपकरण का उपयोग कर सकते हैं कि ऑब्जेक्ट आवंटित किए जा रहे हैं या कहां स्थानांतरित किए जा रहे हैं।

अद्यतन 2015/06/26: यदि आप OS X 10.7 पर और इसके बाद के संस्करण और iOS 5 पर और ऊपर weak संकेत का उपयोग कर रहे हैं, वे स्वचालित रूप से nil पर निर्धारित किया जाएगा जब संदर्भित वस्तु जारी किया गया है। देखें https://en.wikipedia.org/wiki/Automatic_Reference_Counting#Zeroing_Weak_References

0

किसी ऑब्जेक्ट को जारी करने के बाद उस ऑब्जेक्ट का मान nil पर सेट नहीं किया जाएगा।

+2

नष्ट वस्तु पर 'retainCount' को कॉल करने से आपको क्रैश या अन्य अपरिभाषित व्यवहार मिलेगा, शून्य नहीं। – hamstergene

+0

वास्तव में, उस विशेष कोड नमूने में सबसे अधिक संभावना परिणाम यह है कि 'retainCount' 1 ** वापस लौटाएगा, भले ही इसे हटा दिया गया हो **! – Chuck

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

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