2009-11-05 12 views
8

'मेमोरी चेतावनी' शीर्षक वाले अनुभाग में http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmNibObjects.html, मैं इस बात का पालन नहीं करता कि आईबीओलेटलेट डीलोक में क्यों शून्य हो गया है। यदिसेटिंग्स आईबीओटलेट्स को डेलोक में

self.anOutlet = nil 

विषय में उल्लिखित दुर्घटना का कारण बनता है, तो वे ivar को शून्य क्यों बना रहे हैं?

आम तौर पर, जब आप पहले ही रिलीज कर रहे हैं तो आप डीलोक में एक ivar को शून्य क्यों सेट करेंगे?

उत्तर

12

release के बाद, सूचक अनिवार्य रूप से अमान्य है और इसे फिर से एक्सेस करने से क्रैश हो सकता है। release के बाद एक चर को nil पर सेट करके आप उस क्रैश को होने से रोकते हैं। एक शून्य सूचक का उपयोग करने में कोई नुकसान नहीं है।

उदाहरण आप जुड़े हैं बस को दर्शाता है यह हमेशा release के बाद nil करने के लिए एक चर या इवर स्थापित करने के लिए एक अच्छा विचार है क्यों, तब भी जब यह चर की तरह दिखता है/इवर फिर से पहुँचा नहीं किया जाएगा।

उदाहरण में, anOutlet इवर वास्तव में सुपर क्लास द्वारा बाद अपने dealloc विधि, एक्सेस किया जाता है, इसलिए यदि आप इसे करने के लिए नहीं के बराबर आप एक दुर्घटना हो जाएगा निर्धारित नहीं करते हैं। इस तरह के परिदृश्य केवल कोड को देखकर स्पॉट करना बहुत मुश्किल है, इसलिए रिलीज के बाद भी हर चर को शून्य करने का अच्छा विचार है, यहां तक ​​कि डेलोक में भी।

1

जारी किए गए ऑब्जेक्ट पर एक संदेश भेजना क्रैश का कारण बनता है, एक शून्य ऑब्जेक्ट को संदेश भेजना अनदेखा किया जाता है।

0

कभी-कभी जब एक संपत्ति अमान्य हो जाती है (शून्य पर सेट) हम अन्य गुणों को भी अमान्य बनाना चाहते हैं। यदि कोई वर्ग self.property_name = nil का उपयोग करके किसी संपत्ति को अमान्य कर देता है, तो यह एक रिलीज़ संदेश भेजेगा, जो कि उस संपत्ति पर रिलीज़ होने पर पहले ही डेलोक में क्रैश का कारण बन जाएगा। अगर अल्ट्राक्शन एक सुपरक्लास में होता है, तो यह त्रुटि छिपी हुई है और काफी खराब है। इसलिए जब भी एक सुपरक्लस किसी संपत्ति को अमान्य कर सकता है, तो इसे अस्वीकार करने के बजाय इसे शून्य पर सेट करना एक अच्छा विचार हो सकता है।

1

कभी-कभी एक दुर्घटना अच्छी बात है, और एक त्वरित समाधान एक गहरी समस्या को छिपाएगा। एक रिलीज वैरिएबल को कॉल करना कुछ ऐसा हो सकता है जिसे आप जानना चाहते हैं।

पुस्तक आईओएस व्यंजनों इस मुद्दे को दर्शाता है:

-dealloc
-dealloc में सभी प्रासंगिक उदाहरण चर जारी करने के साथ में

सफाई, हमारे उदाहरण के लिए उन्हें नहीं के बराबर करने के लिए निर्धारित किया है। यह अभ्यास कोको प्रोग्रामर के बीच सबसे गर्म बहस वाले विषयों में से एक है, और बहस के दोनों तरफ वजन कम है। यह पुस्तक बहस में भाग लेने के लिए बिल्कुल नहीं है: हम उन्हें शून्य पर सेट करते हैं, लेकिन इसका मतलब यह नहीं है कि आपको करना है। यदि आपको नील-इन-डेलोक पसंद नहीं है, तो इसे अपने कोड से बाहर छोड़ने के लिए स्वतंत्र महसूस करें।
http://www.cocoabuilder.com/archive/cocoa/204055-why-should-we-set-ivars-to-nil-in-dealloc.html

:

एक त्वरित गूगल खोज इस सूत्र पाया

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