UnsafeMutablePointer
के लिए दस्तावेज़ बहुत स्पष्ट है। पॉइंटर ऑब्जेक्ट के विनाश पर कोई ऑटो-डीलोकेशन नहीं है।
पुन कि क्या आप deallocating से पहले नष्ट कर देना चाहिए, यह भी बहुत स्पष्ट है:
/// The pointer can be in one of the following states:
///
/// - memory is not allocated (for example, pointer is null, or memory has
/// been deallocated previously);
///
/// - memory is allocated, but value has not been initialized;
///
/// - memory is allocated and value is initialized.
लेकिन भालू मन में आप आगे और पीछे इन राज्यों के बीच परिवर्तन कर सकते हैं। तो ऑब्जेक्ट करने के बाद वस्तुओं को डी-प्रारंभिक (उर्फ नष्ट करना) शुरू करना, स्मृति अब "प्रारंभिक" स्थिति में नहीं है, ताकि आप इसे फिर से शुरू या रद्द कर सकें। आप कभी भी प्रारंभ किए बिना आवंटित कर सकते हैं, फिर रद्द कर सकते हैं।
और जब dealloc
बुला:
/// Deallocate `num` objects.
...
/// Precondition: the memory is not initialized.
///
/// Postcondition: the memory has been deallocated.
इसलिए आप चाहिए कॉल dealloc
कॉल करने से पहले किसी भी initialized वस्तुओं पर नष्ट कर। आप शायद उसमें सही हैं क्योंकि CGPoint
की तरह कुछ पूरी तरह से निष्क्रिय है (केवल दो फ़्लोटिंग पॉइंट अंकों की एक स्ट्रक्चर) शायद पर कॉल करने से पहले destroy
पर कॉल करने के लिए कोई नुकसान नहीं करता है लेकिन आप बिना जाने निश्चित नहीं हो सकते कार्यान्वयन (पॉइंटर स्ट्रक्चर और कंपाइलर दोनों का संभवतः, क्योंकि मानक lib lib भाषा का अर्ध-भाग है, वहां कुछ बेक्ड-इन ऑप्टिमाइज़ेशन हो सकते हैं), और आम तौर पर, यह केवल एक अच्छी आदत नहीं है। जल्द या बाद में आप String
को नष्ट करना भूल जाएंगे, और फिर आपको खेद होगा।
यदि आप UnsafePointer
द्वारा स्मृति के स्वचालित स्वयं सफाई के कुछ प्रकार के लिए उम्मीद कर रहे थे (इस में से कोई भी move
संचालन btw जो पुराने स्मृति को नष्ट करने के साथ नए स्मृति आरंभ गठबंधन के लिए खातों), मुझे नहीं लगता कि यह एक के रूप में संभव होगा) यह एक संरचना है, इसलिए deinit
को दायरे से बाहर निकलने पर स्वत: डिलीकेट करने के लिए लागू नहीं किया जा सकता है, और बी) यह अपने आकार को ट्रैक नहीं करता है - आपको यह ट्रैक करना होगा कि आप कितना आवंटित करते हैं, और deallocate
पर कॉल में स्पष्ट रूप से वापस आपूर्ति करें।
मानक लाइब्रेरी में कुछ ऐसा है जो आपको स्वयं को ऐसा करने के बिना स्मृति को स्वत: डिलीकेट करता है - HeapBufferStorage
, मानक लाइब्रेरी में एक और एकमात्र कक्षा। संभवतः यह deinit
के कार्यान्वयन से लाभ प्राप्त करने के लिए विशेष रूप से एक वर्ग है। इसे प्रबंधित करने के लिए HeapBuffer
भी है, और इसमें एक आसान isUniquelyReferenced()
फ़ंक्शन है जो आपको यह बताने की अनुमति देता है कि इसकी प्रतिलिपि बनाई गई है (भले ही यह एक संरचना है) और इसलिए आपको ऐरे और तारों के समान प्रति-लिखने की क्षमता लागू करने की अनुमति मिल जाएगी।
क्या आप मेमोरी लीक की जांच के लिए एक्सकोड का उपयोग नहीं कर सकते? – michaelsnowden
यदि आप 'arr.dealloc (4) 'को कॉल नहीं करते हैं तो आप स्मृति को रिसाव करेंगे। यह एक अच्छा अवलोकन (शायद एक डुप्लिकेट) लगता है: http://stackoverflow.com/questions/27670643/confusion-regarding-terminology-concerning-unsafemutablepointers-destroy –
@doctordoder क्या आपने इसे आजमाया? यहां कोई CGPoint ऑब्जेक्ट्स नहीं हैं - यह कहीं स्मृति की एक ब्लॉक है, इसलिए मैं इसे स्मृति के सभी ब्लॉक में आसानी से नहीं चुन सकता। – matt