मैं अभी पढ़ रहा हूं कि एक इनिट विधि में ठीक से कैसे विफल होना है और दस्तावेज़ एक-दूसरे से असहमत प्रतीत होते हैं। एक अपवाद फेंकने की सिफारिश करता है जबकि अन्य सफाई और शून्य लौटने की सलाह देते हैं। यहां वर्तमान सर्वोत्तम अभ्यास क्या है?[स्वयं रिलीज], [स्वयं dealloc] या [सुपर dealloc] init तरीकों में?
उत्तर
मेरा मानना है कि आमतौर पर स्वीकार्य अभ्यास विफलता पर शून्य वापस करना है। लेकिन आप स्वयं को रिहा करने का एक रिसाव से बचने के लिए चाहते हैं: अपवाद पर
-(id)init
{
if (self = [super init]) {
...
if (thingsWentWrong) {
[self release];
return nil;
}
...
}
return self;
}
जिस विधि का मैंने हमेशा उपयोग किया है वह सफाई और शून्य लौट रहा है। आपके प्रश्न शीर्षक में जिन तीन विधियों का उल्लेख है, वे कॉल पदानुक्रम में सेगफाल्ट अधिक हो सकते हैं, जबकि शून्य वापस नहीं आएगा। मेरा मानना है कि ऐप्पल दस्तावेज़ स्वयं विफलता पर वापस लौटने के लिए कहते हैं। आप विसंगतियों को कहां ढूंढ रहे हैं?
बस वापस लौटने से स्मृति रिसाव हो जाएगी, क्योंकि आवंटन के लिए कॉल एक वस्तु को बनाए रखने के साथ एक वस्तु बनायेगा। –
स्मृति रिसाव वह है जिसे मैं टालना चाहता हूं। डॉक्स – Kevin
लिंक: त्रुटि जांच प्रारंभ के दौरान - http://tr.im/mlyA एक प्रारंभकर्ता को लागू - http://tr.im/mlyX आप देखेंगे कि दूसरी कड़ी में नमूना कोड के तहत वे इसके बजाय एक अपवाद फेंकने की सलाह देते हैं। मुझे पूरा यकीन है कि वर्तमान सर्वोत्तम अभ्यास नहीं है। – Kevin
कोको के दर्शन है कि वे केवल, स्थितियों कि प्रोग्रामर त्रुटियाँ हैं में फेंक दिया जाना चाहिए एक तरीका है करने के लिए एक अवैध तर्क गुजर की तरह है। अगर कुछ और गलत हो जाता है, तो विधि को सिर्फ शून्य या शून्य वापस नहीं करना चाहिए, और उम्मीद है कि एनएसईआरआर ** ** "आउट" पैरामीटर के माध्यम से विवरण की रिपोर्ट करें।
इसमें -init विधियां शामिल हैं। यदि त्रुटि स्थिति कुछ ऐसा है जो वैध उत्पाद में वैध रूप से हो सकती है, तो विधि को स्वयं को छोड़ना चाहिए (रिसाव से बचने के लिए) और शून्य वापस आना चाहिए।
सही समाधान (अपवाद और/या [self release]; return nil;
) कवर किए गए हैं, मैं गलत समाधानों को संबोधित करूंगा।
सीधे dealloc
न भेजें। यह release
का काम है। (और यदि आपका कोड कभी भी जीसी के तहत चल रहा है, dealloc
लागू नहीं है, और मैं केवल यह कह सकता हूं कि इससे कौन सी समस्याएं कॉल होंगी।)
इसे सीधे भेजने के लिए super
का उपयोग न करें। इससे आपके dealloc
कार्यान्वयन पर छोड़ दिया जाएगा।
- 1. अगर (स्वयं = [सुपर init]) बनाम अगर ((स्वयं = [सुपर init]))
- 2. dealloc
- 3. आईफोन एसडीके: Dealloc बनाम रिलीज?
- 4. क्या dealloc
- 5. UIWebview या dealloc UIWebview
- 6. उदाहरण है, जबकि 'स्वयं' का इस्तेमाल किया चर के '[(सुपर या स्वयं) init ...]'
- 7. फोन करके स्वयं .__ init __ (...)
- 8. 'स्वयं' को समझना और सुपर
- 9. समस्या dealloc में NSTimer अमान्य
- 10. उद्देश्य-सी में "सुपर" क्या है? (स्वयं! = सुपर)?
- 11. मुफ्त, dealloc, रिलीज, और autorelease के बीच मतभेद क्या हैं?
- 12. उद्देश्य-सी में क्यों, हम केवल [सुपर init] के बजाय स्वयं = [सुपर init] का उपयोग करते हैं?
- 13. UIViewController और UIview dealloc को
- 14. ओबीजे-, 'स्व' का उपयोग '[' सुपर या स्वयं) init के परिणाम पर सेट नहीं किया गया है ...] '
- 15. कोको में स्वयं को देखकर
- 16. 'स्वयं' लौटने पर 'आत्म (स्वयं या स्वयं) init ...]' के परिणाम पर सेट नहीं किया गया है जब मैं कस्टम सेल
- 17. पायथन: सुपर और __init __() बनाम __init __ (स्वयं)
- 18. dealloc, रिलीज का उपयोग करें या गुणों के लिए शून्य पर सेट?
- 19. एक्सएसएल 1.0 में आप बच्चे या स्वयं (बच्चों + स्वयं)
- 20. "स्वयं"
- 21. सुपर (थ्रेड, स्वयं) .__ init __() थ्रेडिंग के लिए क्यों काम नहीं करता है। थ्रेड सबक्लास?
- 22. अगर (स्वयं = [सुपर init]) - एलएलवीएम चेतावनी! आप इसके साथ कैसे काम कर रहे हैं?
- 23. [myVar dealloc] और [myVar रिलीज] के बीच सबसे अच्छा अंतर क्या बताता है?
- 24. लाइब्रेरी या स्वयं का फ्रेमवर्क?
- 25. जावा का 'स्वयं' कीवर्ड
- 26. रूबी: रूबी में स्वयं
- 27. इंटरफेस में स्वयं संदर्भ
- 28. केवीओ का उपयोग करते समय स्वयं को स्वयं के पर्यवेक्षक के रूप में हटाने के लिए आवश्यक है?
- 29. स्वयं को सेट करना। Window.rootViewController SIGABRT
- 30. कैसे निर्धारित करें जो NSNotification dealloc-एड के लिए पर्यवेक्षक
फीडबैक दोस्तों के लिए धन्यवाद। यही वह है जो मैं कर रहा था और उचित दृष्टिकोण माना जाता था लेकिन दस्तावेज़ों में अन्य दो तरीकों के संदर्भ में मुझे लगता था कि कुछ खास मामलों के बारे में पता होना चाहिए। – Kevin