2011-11-10 19 views
5

मैंने पहले से ही इसी तरह के एक प्रश्न पूछा, लेकिन मैं अभी भी नहीं देख सकता मुसीबत?ओबीजे-, 'स्व' का उपयोग '[' सुपर या स्वयं) init के परिणाम पर सेट नहीं किया गया है ...] '

-(id)initWithKeyPadType: (int)value 
{ 
    [self setKeyPadType:value]; 
    self = [self init]; 
    if(self != nil) 
    { 
     //self.intKeyPadType = value; 

    } 
    return self; 
} 

- (id)init { 

    NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] 
                   autorelease]; 
    decimalSymbol = [formatter decimalSeparator]; 
.... 

चेतावनी चेतावनी का मतलब है कि यह क्या कहते हैं ऊपर Instance variable used while 'self' is not set to the result of '[(super or self) init...]'

+1

अगर मैं सही अपने कोड को समझते हैं, आप [सुपर init] और इस गंदगी कर सकते हैं अपनी स्मृति आवंटन –

+0

बुला वह बुला नहीं कर रहा है सुपर init कहीं भी – jrturton

उत्तर

4

जो आप करने की कोशिश कर रहे हैं वह तकनीकी रूप से ठीक है, लेकिन कुछ स्तर पर आपको [super init] का आह्वान करने की आवश्यकता है। यदि आपकी कक्षा की init विधि बहुत आम प्रारंभिकरण है जो अन्य initWith... विधियों का उपयोग करती है, तो वहां अपने [super init] डालें। साथ ही, हमेशा सुनिश्चित करें कि कक्षा init 'डी है जो आवृत्ति चर के साथ खेलने की कोशिश करने से पहले है।

- (id) initWithKeyPadType: (int)value 
{ 
    self = [self init]; // invoke common initialisation 
    if(self != nil) 
    { 
     [self setKeyPadType:value]; 
    } 
    return self; 
} 

- (id) init 
{ 
    self = [super init]; // invoke NSObject initialisation (or whoever superclass is) 
    if (!self) return nil; 

    NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] 
                  autorelease]; 
    decimalSymbol = [formatter decimalSeparator]; 

    ... 
+0

क्या आप वास्तविक जोखिम के बारे में और अधिक कह सकते हैं जो जीसीसी चेतावनी बताती है? ऑब्जेक्ट मेमोरी का शून्यकरण आवंटित समय पर होता है (जो मुझे विश्वास है), ऐसा लगता है कि केवल एक @ सार्वजनिक या @ संरक्षित ivar को सुपरक्लास की 'init' विधि द्वारा क्लॉब्ड होने का खतरा होगा, चेतावनी की आवश्यकता है। मैं नहीं सोच सकता कि क्यों स्टाइलिस्टिक रूप से छोड़कर चेतावनी निजी ivar के लिए उपयोगी होगी, लेकिन यह आमतौर पर संकलक की चिंता नहीं होती है। –

+0

@quixoto: + alloc स्मृति आउट शून्य करता है। मुझे नहीं पता कि यह क्यों महत्वपूर्ण है ... यह इस तथ्य के साथ कुछ करने के लिए हो सकता है कि '[सुपर इनिट]' पर कॉल 'शून्य' वापस आ सकता है, और यदि ऐसा होता है तो सभी '[उप init]' विधियों को भी 'शून्य 'वापस करना चाहिए। इसके अलावा मुझे कोई संकेत नहीं होगा कि जीसीसी क्यों परवाह करेगा। – dreamlax

2

लाइन से आता है। आप decimalSymbol पर कुछ असाइन कर रहे हैं, जो एक आवृत्ति चर है, लेकिन उस बिंदु पर कोई उदाहरण नहीं है। आपको

self = [super init]; 

आपकी init विधि की शुरुआत में चाहिए। किसी बिंदु पर वस्तु को बनाया जाना चाहिए, किसी बिंदु पर इसे एनएसओब्जेक्ट (सुपर इनिट्स की एक श्रृंखला के माध्यम से) पर वापस कॉल करना होगा।

+3

यह कहना "कोई एक छोटे से मजबूत करने से पहले एक चर का उपयोग कर रहे उदाहरण। " 'alloc' पहले से ही उदाहरण बनाया जाना चाहिए था। समस्या यह है कि उदाहरण सही ढंग से प्रारंभ नहीं किया जा सकता है (क्योंकि यही है 'init' करता है)। – Chuck

+0

ठीक है, सच है। कोई "काम नहीं" उदाहरण? – jrturton

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