2010-07-16 10 views
6

में डेलोक क्या है मैं उद्देश्य सी के बारे में एक सामान्य प्रश्न पूछना चाहता हूं। जब मैं आईफोन एप्लिकेशन के प्रोग्राम को लिखता हूं, तो मुझे हमेशा .m में 'dealloc' नामक एक फ़ंक्शन दिखाई देता है। इस विधि को कब कहा जाएगा? क्या मुझे आवेदन के लिए यहां सभी [रिलीज] को अच्छी तरह से रखना होगा? आपका बहुत बहुत धन्यवाद।उद्देश्य सी

// ------------------ अपडेट की गई सामग्री ------------------------ -

NSArray *arr; 
NSString *str; 
NSMutableArray *mutableArr; 

// in the dealloc 
// it should have to following 
[arr release]; 
[str release]; 
[mutableArr release]; 

फ़ंक्शन को 3 बार कॉल किया जाएगा?

उत्तर

12

किसी ऑब्जेक्ट पर डेलोक विधि को कॉल किया जाता है जब यह गिनती की संख्या शून्य तक पहुंच जाती है। प्रत्येक 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 भी देखें।)

+2

आप लाइन पर निर्देशों को अलग करने के लिए अल्पविराम का उपयोग कर सकते हैं। उदाहरण के लिए '[foo रिलीज], foo = nil; 'आदि – Abizern

+0

दिलचस्प। क्या यह बेहतर है? –

+0

नहीं, बस और अधिक भ्रमित। इसका अल्पविराम ऑपरेटर ('ए, बी') जिसके परिणामस्वरूप सही अभिव्यक्ति के परिणामस्वरूप (यदि आप कहीं भी मूल्य का उपयोग करेंगे, उदाहरण के लिए 'x = y, z;')। –

4

इस विधि को कब कॉल किया जाएगा?

यह तब कहा जाता है जब उस वस्तु के लिए संदर्भ गणना 0 हो जाती है क्योंकि इसके सभी पॉइंटर्स जारी किए जाते हैं। इसके द्वारा उठाई गई स्मृति को हटा दिया जाता है (मुक्त); वस्तु ही नष्ट हो जाती है।

क्या मुझे एप्लिकेशन के लिए यहां सभी [रिलीज] को अच्छी तरह से रखना होगा?

हां, उस वस्तु के सभी गुणों को अभी भी जारी रखें जो अभी भी बनाए रखा गया है।

संपादित करें: अपने अद्यतन सवाल का जवाब में, dealloc अपने कस्टम वस्तु में केवल एक बार कहा जाता है। इसके बाद ये तीन संदेश भेजे जाएंगे:

[arr release]; 
[str release]; 
[mutableArr release]; 

तीन वस्तुओं में से प्रत्येक के लिए। वे पूरी तरह विभिन्न वस्तुओं रहे हैं, लेकिन अगर आप केवल प्रत्येक का एक उदाहरण है, तो उनके संदर्भ में गिना जाता है सभी 0 और उनकेdealloc तरीकों के नीचे जाना स्वचालित रूप से कहा जाता है।

+0

आपके उत्तर के लिए धन्यवाद। मैं 'कब' के बारे में पूछना चाहता हूं। अगर मेरे पास 3 ऑब्जेक्ट्स रिलीज़ हैं। तब वस्तुओं में से एक 0 हो जाता है। विधि को बुलाया जाएगा? – Questions

+0

जब आपके पास अपने कोड में ऑब्जेक्ट के 3 उदाहरण होते हैं, और आप पहले ऑब्जेक्ट पर '[ऑब्जेक्ट 1 रिलीज]' (चलो कहते हैं) करते हैं, तो आपके पास अभी भी 2 उदाहरण बाकी हैं, इसलिए इसे अभी तक नहीं कहा जाता है। 'Dealloc' कहने के लिए आपको ऑब्जेक्ट के * सभी * उदाहरणों को रिलीज़ करने की आवश्यकता होगी। – BoltClock

+0

@ मार्क: क्या आप * "एक ऑब्जेक्ट के 3 संदर्भ" * या * "3 विशिष्ट ऑब्जेक्ट्स" * के लिए पूछ रहे हैं? –

1

जैसा कि आपने अनुमान लगाया है, यह कहलाता है कि जब कोई ऑब्जेक्ट नष्ट हो जाता है। ऑब्जेक्ट को अपनी सारी चीज़ें जारी करनी चाहिए।

0

दूसरे शब्दों में, डेलोक आपके ऑब्जेक्ट्स को आवंटित स्मृति को मुक्त/नष्ट/रिलीज़ करता है। मेमोरी को आवंटित ऑब्जेक्ट्स को नष्ट किया जाना चाहिए जब एक बार स्मृति रिसाव से बचने के लिए उपयोग नहीं किया जाता है जो आपके एप्लिकेशन को क्रैश कर सकता है।

ZaldzBugz