2014-06-27 4 views
18

मैं iOS 8 परियोजना के लिए अपने कोड में परिवर्तित कोशिश कर रहा हूँ, और मैं कैसे इस चेतावनी को ठीक करने पर कुछ स्पष्टीकरण की जरूरत है: इस कोड पर "Convenience initializer missing a 'self' call to another initializer""सुविधा प्रारंभकर्ता एक और प्रारंभकर्ता करने के लिए एक 'स्वयं' कॉल लापता"

:

-(instancetype) initWithCoder:(NSCoder *)aDecoder // warning: Convenience initializer missing a 'self ' call to another initializer 
{ 
    if (self = [super initWithCoder:aDecoder]) // warning: convenience initializer should not invoke an initializer on 'super' 
    { 
    // some init stuff here 
    } 
    return self; 
} 
+1

इस कक्षा को किस वर्ग से प्राप्त किया गया है? –

+0

Uiview – ignotusverum

+1

से विरासत प्राप्त करता है और यह कथन के बाहर इस असाइनमेंट को स्थानांतरित करने के लिए आईएमओ अच्छा व्यवहार है। –

उत्तर

31

एक्सकोड 6 के साथ नया क्लैंग शिपिंग NS_DESIGNATED_INITIALIZER मैक्रो के माध्यम से संकलक-लागू नामित प्रारंभकर्ताओं को सक्षम बनाता है। जब यह किसी वर्ग की घोषणा में इनिट-फ़ैमिली विधियों में से किसी एक को चिह्नित करता है, तो अन्य सभी प्रारंभकर्ताओं को "माध्यमिक" (ऐप्पल की शब्दावली का उपयोग करने के लिए) प्रारंभकर्ता माना जाता है। यही है, जब तक वे एक निर्दिष्ट प्रारंभकर्ता तक नहीं पहुंच जाते हैं, तब तक उन्हें एक दूसरे नामित या माध्यमिक प्रारंभकर्ता से कॉल करना चाहिए।

UIView नामित प्रारंभकर्ता के रूप में कुछ भी नहीं है, इसलिए कहीं आपने कक्षा के एक और init विधि को नामित प्रारंभकर्ता के रूप में घोषित कर दिया है। इसके कारण, एनएससीओडर का प्रारंभिक माध्यमिक के रूप में चिह्नित किया जाता है और चेतावनी उत्पन्न करता है। मैंने इसके बारे में एक रडार (rdar: // 17559176) दायर किया है, लेकिन तब तक इसे -Wno-objc-designated-initializers निर्दिष्ट करके प्रति फ़ाइल आधार पर बंद किया जा सकता है, या -Wobjc-designated-initializers के साथ उपयुक्त डायग्नोस्टिक पुश-पॉप प्रदान करके।

+2

कम से कम आईओएस एसडीके 9.2 के रूप में, UIView के -initWithFrame: और -initWithCoder दोनों को एनएस_DESIGNATED_INITIALIZER चिह्नित किया है। – bleater

3

बस @CodaFi क्या कह रहा है का एक परिशिष्ट:

एप्पल किए गए दस्तावेज़ों की
  • एक टुकड़े का मैं नामित initializers पर पाया here है।
  • मैंने कुछ और विकल्पों के साथ इन चेतावनियों को here को दबाने के तरीके पर एक प्रश्न का उत्तर दिया है। मुझे विशेष रूप से प्रीकंपील्ड हेडर विधि (# 2) पसंद है, क्योंकि यह आपको इसे ठीक करने के लिए याद दिलाता है।
संबंधित मुद्दे