किसी ऑब्जेक्ट पर डेलोक विधि को कॉल किया जाता है जब यह गिनती की संख्या शून्य तक पहुंच जाती है। प्रत्येक retain
कॉल के लिए बनाए रखने के लिए गणना की जाती है, और प्रत्येक release
कॉल के लिए एक बार कम हो जाती है। autorelease
भविष्य में release
कॉल करता है जब वर्तमान NSAutoreleasePool को निकाला जाता है, आमतौर पर एक ईवेंट चक्र के अंत में, लेकिन आप स्मृति गहन परिचालनों पर अपना स्वयं का एनएसयूयूटोरिलीपूल सेट कर सकते हैं। (विवरण के लिए NSAutoreleasePool दस्तावेज़ देखें।)
आपको डेलोक में क्या डालना चाहिए? आपको प्रत्येक सदस्य ऑब्जेक्ट के लिए उस वर्ग की वस्तु को बनाए रखने के लिए रिलीज़ करना चाहिए।
कुछ चीजें इसे आसान बनाती हैं। शून्य ऑब्जेक्ट चुपचाप भेजे गए किसी भी संदेश को अनदेखा कर देगा, इसलिए [foo रिलीज़] जब foo = nil एक बग नहीं है। हालांकि, किसी ऑब्जेक्ट को दो बार जारी करने से गंभीर समस्याएं हो सकती हैं। मेरा (शायद ही अनोखा) समाधान यह है कि जब भी मैं इसे रिलीज़ करता हूं, मैंने जो भी अभी रिलीज़ किया है, उसे स्पष्ट रूप से सेट करना है। वास्तव में, मैंने रिलीज के समान लाइन पर शून्य असाइनमेंट लगाया है, इसलिए मैं "रिलीज" के लिए grep कर सकता हूं और उन स्थानों को ढूंढ सकता हूं जिन्हें मैंने याद किया था। उदाहरण:
@interface MyClass {
Foo *foo;
Bar *bar;
NSInteger baz;
}
-(void)dealloc;
@end
@implementation MyClass
-(void)dealloc {
[foo release]; foo = nil;
[bar release]; bar = nil;
[super dealloc];
}
@end
मैं भी जब उस चर के बारे में गुंजाइश या वस्तु के बारे में दूर जाना है से बाहर जाने के लिए है एक चर को नहीं के बराबर प्रदान करेंगे। क्यों?यदि मैंने इसे जारी करने के बाद एक ही कक्षा के उसी ऑब्जेक्ट को उसी मेमोरी स्पेस में आवंटित किया है, तो की गारंटी देता है, वहां कोई भी खतरनाक पॉइंटर्स नहीं होंगे जो नई वस्तु गलती से उपयोग कर सकती है और एक दुःस्वप्न डिबगिंग कर सकती है। (डीएसगिंग सहायता के लिए NSZombieEnabled भी देखें।)
स्रोत
2010-07-16 06:32:51
आप लाइन पर निर्देशों को अलग करने के लिए अल्पविराम का उपयोग कर सकते हैं। उदाहरण के लिए '[foo रिलीज], foo = nil; 'आदि – Abizern
दिलचस्प। क्या यह बेहतर है? –
नहीं, बस और अधिक भ्रमित। इसका अल्पविराम ऑपरेटर ('ए, बी') जिसके परिणामस्वरूप सही अभिव्यक्ति के परिणामस्वरूप (यदि आप कहीं भी मूल्य का उपयोग करेंगे, उदाहरण के लिए 'x = y, z;')। –