2009-02-11 12 views
7

मैं अपने iPhone परियोजना में इस लाइन पर एक EXC_BAD_ACCESS (SIGBUS) हो रही है में है स्टंप यह है कि मुझे समझ में नहीं आता कि यह रेखा कैसे दुर्घटनाग्रस्त हो सकती है, क्योंकि अगर कथन का मतलब शून्य के लिए जांचना है। क्या मैं उद्देश्य-सी कार्यों के तरीके को गलत समझ रहा हूं, या क्रैश स्टेटमेंट में लाइन नंबरों में कभी-कभी गलत रेखा होती है?अगर (चर) के रूप में अगर एक ही ऑब्जेक्टिव-सी

उत्तर

16

सिर्फ इसलिए कि एक चर को nil के अलावा किसी अन्य मान पर सेट किया गया है, इसका मतलब यह नहीं है कि यह वैध ऑब्जेक्ट को इंगित कर रहा है। उदाहरण के लिए:

id object = [[NSObject alloc] init]; 
[object release]; 
NSLog(@"%@", object); // Not nil, but a deallocated object, 
         // meaning a likely crash 

आपका टाइमर शायद पहले से ही मिल गया (या शायद सब पर बनाया नहीं किया गया है?) छुटकारा गया है, लेकिन चर शून्य करने के लिए सेट नहीं किया गया।

+0

सही समझ में आता है, धन्यवाद। मुझे एहसास हुआ कि मैंने अपना टाइमर बरकरार रखा नहीं है, जो मुझे करना चाहिए। – rustyshelf

+0

टाइमर को बनाए रखना सामान्य रूप से आवश्यक नहीं है। यदि आप initWithFireDate के साथ टाइमर बनाते हैं ..., यह स्वतः नहीं किया जाता है। और एक बार एक टाइमर को रनलॉप में जोड़ा जाता है (या तो addTimer या शेड्यूल टाइमर ... विधियों में से एक), रनलोप इसे तब तक बरकरार रखता है जब तक कि यह समाप्त न हो जाए। – Chuck

+0

मैंने इसे एनएसटीमर शेड्यूल टाइमर विथटाइम इंटरवल के साथ बनाया जो मुझे लगता है कि ऑटो रिलीज़ है। InitWithFireDate बेहतर माना जाता है? – rustyshelf

-1

वे वही होना चाहिए। शायद लाइन नंबर वास्तव में गलत है।

अपने कोड में उसके पास अन्य संभावित त्रुटियों की तलाश करें और देखें कि आपको कुछ भी मिल रहा है या नहीं।

6

मैं बस इसी तरह की समस्या में भाग गया, इसलिए यहां एक और उदाहरण है कि आपके जैसे असफल होने की जांच हो सकती है।

मेरे मामले में, मैं इस तरह एक शब्दकोश से मूल्य हो रही थी:

NSString *text = [dict objectForKey:@"text"]; 

बाद में, मैं इस तरह चर का उपयोग कर रहा था:

if (text) { 
    // do something with "text" 
} 

यह एक EXC_BAD_ACCESS त्रुटि हुई और कार्यक्रम दुर्घटना।

समस्या यह थी कि मेरे शब्दकोश में NSNull मूल्यों का उपयोग किया गया था, जहां किसी ऑब्जेक्ट का खाली मूल्य था (इसे JSON से deserialized किया गया था), क्योंकि NSDictionary शून्य मान नहीं रख सकता है। मैं इस तरह काम कर रहा हूं:

NSString *text = [dict objectForKey:@"text"]; 
if ([[NSNull null] isEqual:text]) { 
    text = nil; 
} 
+1

अरे, मुझे एहसास नहीं हुआ कि NSDictionary शून्य मूल्यों को पकड़ नहीं सकता था। बहुत बढ़िया जवाब। – Ben

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