2010-04-18 15 views
7

मुझे NSDictionarynull पर NSString के साथ एक समस्या है, भले ही स्ट्रिंग शब्दकोश में है। यहाँ कोड है:ऑब्जेक्ट का कारण क्या होगा फोर्के: जगह में वैध स्ट्रिंग के साथ शून्य वापस करने के लिए?

- (void)sourceDidChange:(NSNotification *)aNote { 
    NSDictionary *aDict = [aNote userInfo]; 
    DLog(@"%@", aDict); 
    NSString *newSourceString = [aDict objectForKey:@"newSource"]; 
    DLog(@"%@", newSourceString); 
    newSourceString = [newSourceString stringByReplacingOccurrencesOfString:@" " withString:@""]; 
    DLog(@"%@", newSourceString); 
    NSString *inspectorString = [newSourceString stringByAppendingString:@"InspectorController"]; 
    DLog(@"%@", inspectorString); 
    newSourceString = [newSourceString stringByAppendingString:@"ViewController"]; 
    DLog(@"%@", newSourceString); 
} 

और मैं निम्नलिखित लॉग बयान मिलता है:

2010-04-17 23:50:13.913 CoreDataUISandbox[13417:a0f] -[RightViewController sourceDidChange:] { newSource = "Second View"; } 
2010-04-17 23:50:13.914 CoreDataUISandbox[13417:a0f] -[RightViewController sourceDidChange:] (null) 
2010-04-17 23:50:13.916 CoreDataUISandbox[13417:a0f] -[RightViewController sourceDidChange:] (null) 
2010-04-17 23:50:13.917 CoreDataUISandbox[13417:a0f] -[RightViewController sourceDidChange:] (null) 
2010-04-17 23:50:13.917 CoreDataUISandbox[13417:a0f] -[RightViewController sourceDidChange:] (null) 

आप देख सकते हैं, स्ट्रिंग कुंजी newSource तहत शब्दकोश में है, फिर भी जब मैं objectForKey: कहते हैं, मैं null प्राप्त करें। मैंने परियोजना की सफाई के फॉलबैक विकल्प की भी कोशिश की है।

क्या किसी ने कभी इसमें भाग लिया है, या क्या मैं वास्तव में कुछ मूलभूत भूल गया हूं?

+0

जिज्ञासा से, 'एडिक्ट' को सेट करने और लॉगिंग करने के बाद, यदि आप 'डीएलओजी (@ "% @", [एडिक्ट ऑलकेज़] करते हैं तो क्या होता है); '? – Isaac

+0

क्या यह * वास्तविक * कोड है? किसी भी मौके पर आपने कुंजी को गलत टाइप किया है? 'डीएलओजी (@"% @ ", [एडिक्ट ऑलकेज़] क्या करता है) 'दे? –

+0

आप 'new @' के बजाय '% p' के साथ 'newSourceString' को लॉगिंग करने का भी प्रयास करना चाहेंगे। –

उत्तर

3

इस बिंदु पर, आपको किसी कारण से DLog से एक रिपोर्टिंग त्रुटि के साथ छोड़ दिया गया है।

प्रयास करें:

  1. NSLog के साथ लॉग इन करना।
  2. कोड लाइव होने पर सीधे डीबगर में newSourceString के मान की जांच करें।
2

objectForKey: क्या एक वैध स्ट्रिंग के साथ शून्य वापस करने के लिए कारण होगा?

दो बातों में से एक:

  1. शब्दकोश कि कुंजी के लिए एक वस्तु नहीं है। (चाहे आप सोचें यह अप्रासंगिक है।)
  2. आपके पास कोई शब्दकोश नहीं है; aDictnil है, इसलिए आप objectForKey: संदेश nil पर भेज रहे हैं। nil पर संदेश nil पर वापस आएं लेकिन कुछ भी नहीं करें।

आप देख सकते हैं स्ट्रिंग कुंजी Newsource तहत शब्दकोश में है ...

वास्तव में, मुझे यकीन है कि वहाँ क्या हो रहा है नहीं कर रहा हूँ। एक NSDictionary का विवरण (यदि इसमें उस कुंजी के लिए स्ट्रिंग है) { newSource = "some string here"; } होगा, जो आपके द्वारा लॉग किए गए विवरण से मेल नहीं खाता है। दूसरी तरफ, यदि यह एक ऐसी वस्तु थी जो एक शब्दकोश नहीं है, तो आपको इसे objectForKey: संदेश भेजने की कोशिश करने पर "चयनकर्ता का जवाब नहीं देना चाहिए" अपवाद प्राप्त करना चाहिए। तो यह आपके लॉग आउटपुट से दिखाई देता है, कुछ, मुझे नहीं पता कि यह क्या है, सिवाय इसके कि यह शायद एक शब्दकोश नहीं है।

यह सिर्फ सादा अजीब है।

+0

हर बार जब मैं घुंघराले ब्रेसिज़ में डालता हूं तो उन्होंने कोड ब्लॉक को खराब कर दिया ताकि मुझे उन्हें हटाना पड़े (अभी भी यह सुनिश्चित नहीं है कि यह क्यों हो रहा था)। – theMikeSwan

+0

मैंने उपरोक्त @ द माइकसवान की टिप्पणी के आधार पर लॉग स्टेटमेंट में घुंघराले ब्रेसिज़ को शामिल करने के लिए प्रश्न अपडेट किया है। –

0

मुझे संदेह है कि आपकी स्ट्रिंग वास्तव में, सचमुच "(शून्य)" है - यह कहना है कि यह 6-अक्षरों का लंबा है, और मंत्र (-एन-यू-एल-एल-)।

+0

प्रिंट आउट की पहली पंक्ति से पता चलता है कि कुंजी का "दूसरा दृश्य" का मान है। – TechZen

+0

यदि वह मामला था, तो वह चरण जो 'stringByAppendingString:' लागू होता है, अभी भी '(शून्य)' उत्पन्न नहीं करना चाहिए। – Isaac

+0

कोई भी नहीं सोचा कि यह वास्तव में मजाकिया था? मैं इसे अपने साथी पर कुछ दिन के रूप में खेलना चाहता हूं =) –

1

आप जिस वातावरण में कोडिंग कर रहे हैं उसमें आप उपेक्षा करने में विफल रहते हैं। यदि यह जीएनयूस्टेप के साथ है, विशेष रूप से, gnustep1.19, पढ़ें।अन्यथा अनदेखा करें।

मुझे बस gnustep1.19 (.3) के साथ एक बहुत ही अजीब बग का सामना करना पड़ा, लेकिन यह इस सवाल की पूरी तरह नकल करता है।

NSString * key = <some string> 
NSDictionary * dict = <some dictionary> 

(gdb) p [dict objectForKey:key] 
$20 = (struct objc_object *) 0x0 
(gdb) p [dict objectForKey:@"MyKeyValue"] 
$22 = (struct objc_object *) 0x7fffd94fe690 
(gdb) p [key compare"@MyKeyValue"] 
$25 = NSOrderedSame 

इस मामले में, 'कुंजी' एक और NSDictionary से निकाल कर initialised किया जा रहा था, और अन्य शब्दकोश (एक फ़ाइल से लोड) में प्रविष्टियों की कुछ यूनिकोड वर्ण होते हैं। यही है, अब तक, मुझे मिला एकमात्र सहसंबंध - स्रोत फ़ाइल से यूनिकोड को हटाने और ऐप को फिर से चलाने से यह काम करता है।

इस के लिए कोई मुद्दा नहीं है gnustep1.18 या> = gnustep1.20

2

मैं ने वही समस्या का सामना किया। मेरे लिए समस्या यह थी कि मैंने सोचा कि मेरी कुंजी एनएसएसटींग थी जब यह वास्तव में एनएसएनंबर थी। आप निम्नलिखित

for (id key in [aDict allKeys]){ 
     NSLog(@"%@:%@",key, [[key class] description]); 
    } 
} 
+0

इस प्रक्रिया ने मुझे अपनी समस्या को हल करने में मदद की .. –

0

का उपयोग करके अपनी कुंजी देख सकते हैं मुझे संदेह है कि डिक्टिक्स NSDictionary का उदाहरण नहीं है। पुष्टि करने के लिए इसकी कक्षा लॉग करें।