ऐप्पल पुनर्मूल्यांकन करता है कि आप इनिट और विशेष रूप से डीलोक रूटीन में सेटर्स नहीं कहते हैं।
यह इस तथ्य के कारण है कि इस समय वस्तु केवल आंशिक रूप से स्थापित की गई है, और सेटर्स के पास पर्यवेक्षकों को संलग्न किया जा सकता है, या उप-वर्गों द्वारा ओवरराइड किया जा सकता है, और अन्यथा अनावश्यक रूप से डेलोक के दौरान प्रभावित होता है, या भ्रमित हो सकता है आंशिक रूप से कॉन्फ़िगर किए गए ऑब्जेक्ट के साथ init के दौरान।
इसलिए, आप सामान्य रूप से उपयोग करें: अपने init दिनचर्या में
_navigationController = [[NavController alloc] init];
शैली कोड, अपने dealloc में
[_navigationController release];
शैली कोड, और अन्य कोड में setters जहां किसी चीज़ का पूरी तरह से माना जाता है पूर्ण।
कुछ मामलों पर विचार करने के:
- उपवर्ग setNavigationController ओवरराइड करता है और init द्वारा आवंटित अपनी ही ivars संदर्भ देता है। Init पर क्रैश।
- सबक्लास ओवरराइड सेट अपविगेशन नियंत्रक और डीलोक में जारी अपने स्वयं के इवर्स का संदर्भ देता है। Dealloc पर क्रैश।
- सबक्लास सेट नेविगेशन नियंत्रक ओवरराइड करता है और स्क्रीन के कुछ हिस्सों को दोबारा हटा देता है। चक्र, या गड़बड़ प्रदर्शन के निर्बाध अपशिष्ट।
- अन्य वस्तुओं एक ही समय में पुनः आवंटित की जाती किया जा रहा निरीक्षण navigationController और उन पर्यवेक्षकों dealloc
- दौरान आग आदि
स्रोत
2009-06-17 02:38:00
धन्यवाद, उस मामले में viewDidUnload कोड वस्तु को रिहा करने के लिए dealloc रूप में एक ही कोड का इस्तेमाल किया जा सकता था इसलिए, यानी [_navigationController रिलीज] इसे शून्य करने के बजाय, सही है? – Boon
हां, लेकिन नहीं। -dealloc को छोड़कर हर जगह एक्सेसर का प्रयोग करें। डैनियल ने दिए गए कारणों के लिए -डैलोक में एक्सेसर्स का उपयोग विवादास्पद है (ऐप्पल जो भी वे अनुशंसा करते हैं, उनके बारे में भी अस्पष्ट है)। बस अपने सभी बनाए गए ivars -dealloc में जारी करने की आदत में जाओ। अपने लिए ऐसा करने के लिए किसी अन्य चीज पर शर्त न लगाएं। और जब भी आप कुछ छोड़ते हैं, इसे शून्य पर सेट करें। ओबीजेसी का अधिकांश सुरक्षा नेट के बिना है; अच्छी आदतें आपके प्रोग्राम को काम करती रहती हैं क्योंकि संकलक आपको बचाएगा नहीं। (ठीक है, शायद क्लेंग अंततः हमें बचाएगा, लेकिन केवल इसकी शक्ति का उपयोग अच्छा होगा।) –