2009-10-01 11 views
7

यदि मैं एक नई ऑब्जेक्ट बनाता हूं जिसमें ऑब्जेक्ट बनाया गया है तो पॉइंटर्स शून्य पर इंगित करने के लिए सेट किए गए दो ऑब्जेक्ट पॉइंटर्स (नीचे देखें) शामिल हैं;ठीक है एक पॉइंटर जारी करने के लिए ठीक है?

@interface rocketShip : NSObject { 
    NSString *name; 
    NSNumber *thrust; 
} 

हैं (कुछ अप्रत्याशित कारण) मैं इन संकेत नहीं सौंपते हैं और बाद में उन्हें अपने dealloc विधि में जारी है कि ठीक है, मैं बहुत यकीन है कि यह है हूँ, सिर्फ जांच करने के लिए चाहते थे?

- (void)dealloc{ 
    [name release]; 
    name = nil; 
    [thrust release]; 
    thrust = nil; 
    [super dealloc]; 
} 

गैरी

+2

अपने 'dealloc' कार्यान्वयन के अंत में' [super dealloc] 'को कॉल करना याद रखें। – Jason

+0

क्षमा करें जेसन, मुझे पता था कि, लेकिन किसी भी तरह से यह कट और पेस्ट में खो गया है। – fuzzygoat

उत्तर

22

शून्य के लिए एक संदेश में कोई त्रुटि का कारण नहीं बनेगा भेजा जा रहा है, तो यह ठीक है। आपको यह सुनिश्चित करने की ज़रूरत है कि पॉइंटर्स वास्तव में शून्य हैं - कचरा सूचक को संदेश भेजना संभवतः त्रुटियों का कारण बन जाएगा।

7

हां, आप ऐसा कर सकते हैं क्योंकि आप सुरक्षित रूप से एक संदेश भेज सकते हैं (जैसे release) nil पर और यह कुछ भी नहीं करेगा।

1

आप अपने प्राप्त/सेट तरीकों बनाने के लिए एक्सेसर गुण का उपयोग करते हैं:

@interface rocketShip : NSObject { 
    NSString *name; 
    NSNumber *thrust; 
} 

@property (retain, nonatomic) NSString *name; 
@property (retain, nonatomic) NSNumber *thrust; 

और अपने .m फ़ाइल में:

@synthesize name; 
@synthesize thrust; 

फिर आप सिर्फ अपने चर करने के लिए नहीं के बराबर dealloc में सेट कर सकते हैं । यह वास्तव में आपके सेटर को कॉल करेगा और संदर्भ गिनती को एक करके और साफ चीजों को कम करेगा।

+0

विन्सेंट, यह एक बहुत अच्छा मुद्दा है, मैं अभी सिर्फ @property और @synthesize के बारे में पढ़ रहा हूं। ऑब्जेक्टिव-सी 2.0 – fuzzygoat

+1

की तरफ से पहले मैं बस अपने सिर में पुराने स्कूल को सीधे प्राप्त करना चाहता था, स्पष्टीकरण के रूप में, आपको dealloc में self.name = nil लिखना होगा। बस नाम = शून्य स्थापित करना जीसी के तहत छोड़कर एक रिसाव होगा। – sbooth

+3

हालांकि यह सबसे सरल मामले में काम करेगा, विन्सेंट का सुझाव सबसे अच्छा अभ्यास नहीं है। Dealloc विधि में 'self.name = nil' का उपयोग करके आपके सेटर विधि को कॉल किया जाएगा। यदि कोई उप-वर्ग (या आप) इस सेटर विधि को ओवरराइड करता है जैसे कि इसका दुष्प्रभाव होता है या उदाहरण स्थिति पर निर्भर करता है, तो यह तब हो सकता है जब dealloc से कहा जाता है जहां इंस्टेंस स्थिति निर्धारित नहीं होती है। यह [नाम रिलीज] कॉल करने के लिए * अधिक * बेहतर है। –

0

ऑब्जेक्टिव-सी में वस्तुओं और चर के बीच अंतर करने के लिए यह महत्वपूर्ण है। आप एक पॉइंटर (एक चर का मान) जारी नहीं कर सकते हैं, आप केवल एक ऑब्जेक्ट (ऑब्जेक्ट जिस पर पॉइंटर संदर्भित करता है) जारी कर सकता है। एक शून्य पॉइंटर किसी ऑब्जेक्ट को संदर्भित नहीं करता है, इसलिए शून्य पर भेजे गए संदेश कुछ भी नहीं करते हैं (जो आम तौर पर सुरक्षित है)।

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