2009-11-23 19 views
37

मैं अपने आईफोन ऐप के साथ कुछ मेमोरी मुद्दों को हल कर रहा हूं और मैं बस कुछ मूलभूत बातें सोच रहा हूं। अगर मैं एक ivar स्थापित करता हूं और कभी भी अपने ऑब्जेक्ट के जीवनकाल में इसका उपयोग नहीं करता, जब मैं उस पर डेलोकोक कहता हूं, तो क्या इससे कोई समस्या हो सकती है? जैसेक्या ऑब्जेक्टिव-सी में डिफ़ॉल्ट रूप से इंस्टेंस चर डिफ़ॉल्ट रूप से सेट हैं?

@interface testClass { 
    id myobject; 
} 
@property (nonatomic, retain) id myobject; 
@end 

@implementation testClass 
@synthesize myobject; 
- (id)init { 
    ... 
    // Do I have to set myobject to nil here? 
    // So if myobject isn't used the dealloc call to nil 
    // will be okay? Or can you release the variable without 
    // having set every object to nil that you may may not use 
    ... 
} 

... 

// Somewhere in the code, myobject may be set to 
// an instance of an object via self.myobject = [AnObject grabAnObject] 
// but the object may be left alone 

... 

- (void)dealloc { 
    [myobject release]; 
    [super dealloc]; 
} 
@end 
+0

माइक अब्दुल्ला: मैं अपने संपादन में है कि परिवर्तन किया है। –

+0

आह दाएं, तो फ़ंक्शन में बनाए गए सामान्य चर को 0/nil पर सेट नहीं किया जाता है जब आप उन्हें घोषित करते हैं? बस उदाहरण चर। तो क्या यह सही है कि सामान्य चरों में केवल 'कचरा' होगा जब तक कि आप इसे स्पष्ट रूप से किसी चीज़ पर सेट न करें? –

+0

यह सही है। –

उत्तर

0

मुझे लगता है यह है कि हमेशा init विधि में nil करने के लिए उन ivars स्थापित करने के लिए अच्छा अभ्यास। इस तरह, आप पूरी तरह से निश्चिंत हैं कि विनाशक में release पर आपकी कॉल समस्या का कारण नहीं बन सकती है।

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

अद्यतन: बी.जे. होमर और चक ने बताया है कि ivars स्वचालित रूप से शून्य पर सेट हो जाएगा, इसलिए अब इसे नीचे पर एक निर्णय करने के लिए आता अंदाज।

+3

आप किसी भी तरह से सुनिश्चित हो सकते हैं। एकमात्र तरीका यह है कि आपकी init विधि बेकार असाइनमेंट से भरा है। – Chuck

+0

आपके उत्तर के लिए धन्यवाद :-) –

+0

सबसे अच्छा कोड वह कोड है जिसे आप लिखना नहीं चाहते हैं। यदि कोई भाषा गारंटी देता है, तो उनका उपयोग करें। यदि आप भाषा की मूल बातें (जैसे ivars के शून्य) के दस्तावेज पर संदेह करना शुरू करते हैं तो आप असली खरगोश छेद में हैं। – occulus

11

हां, ivars are always initialized to 0/nil/NULL/NO/etc

हालांकि, अगर यह समझने में आपकी सहायता करता है कि क्या हो रहा है, तो इसके लिए जाएं। प्रदर्शन प्रभाव नगण्य है। आपको ऐसा करने की आवश्यकता नहीं है, लेकिन यदि आप ऐसा करते हैं तो इससे कोई समस्या नहीं आएगी।

+10

मुझे नहीं पता कि कैसे बर्बाद, अनावश्यक कोड अच्छा अभ्यास है। क्या आप अपने सभी स्थानीय चर को एक ही मूल्य में कई बार सेट करना सुनिश्चित करते हैं ताकि यह वास्तव में स्पष्ट हो सके? – Chuck

+11

नहीं। स्थानीय चर कई बार सेट करना कोड की स्पष्टता को कम करेगा और भ्रम को बढ़ाएगा। स्पष्ट रूप से एक ivar स्पष्टता को बढ़ाता है, और ओबीजेसी से कम परिचित टीम का एक नया सदस्य जो हो रहा है उसे आसानी से समझता है। "बर्बाद" कोड को कम करने से कोड स्पष्टता अधिक महत्वपूर्ण है। –

+2

उद्देश्य-सी डेवलपर्स को इवर के शून्य-प्रारंभिकरण से परिचित होना चाहिए। 'Init' विधियों को शून्य करने के कारण अक्सर पूरी तरह से छोड़ा जा सकता है, जो एक अच्छी बात है। यदि डेवलपर्स अभी भी सीख रहे हैं तो उन्हें कोड से इस अवधारणा को नहीं सीखना चाहिए, बल्कि एक पुस्तक, प्रशिक्षक, एसओ या जो भी हो। वे अनावश्यक कोड पढ़कर इस अवधारणा को नहीं सीखेंगे, वैसे भी। –

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