2011-08-11 11 views
13

मैंने जांच की है कि NSDictionary कुंजी मौजूद है या नहीं और समाधान के साथ आया है या नहीं। लेकिन फिर भी यह मुझे एक त्रुटि फेंकता है कि कुंजी को शून्य मान जोड़ रहा है। मुझे यकीन नहीं है कि मेरा कोड सही है या नहीं। अगर किसी के बारे में कोई विचार है तो मेरी मदद कर सकते हैं।जांचें कि NSDictionary में कुंजी मौजूद है या नहीं

NSDictionary *result; 
id myImageURL = [result objectForKey:@"url"]; 
if ((NSNull *)myImageURL == [NSNull null]) 
    myImageURL = @""; 

id myImage = [result objectForKey:@"image"]; 
if ((NSNull *)myImage == [NSNull null]) 
    myImage = @""; 

जांचें कि शून्य शून्य नहीं है और यदि मूल्य नहीं जोड़ता है तो जांचें। लेकिन यह अभी भी मुझे एक त्रुटि देता है क्यों नहीं पता क्यों।

/****OUTPUT*****/ 

2011-08-11 14:56:06.668 Tab_Table_Win[6510:207] RESULTS : { 
image = "<UIImage: 0xbc332c0>"; 
url = "http://a3.twimg.com/profile_images/999228511/normal.jpg"; 
} 

2011-08-11 14:56:06.669 Tab_Table_Win[6510:207] url : http://a3.twimg.com/profile_images/999228511/normal.jpg 
2011-08-11 14:56:06.670 Tab_Table_Win[6510:207] IMage : <UIImage: 0xbc332c0> 

/*****Breaks Here ***/ 

2011-08-11 14:56:06.876 Tab_Table_Win[6510:207] RESULTS : { 
} 
2011-08-11 14:56:06.878 Tab_Table_Win[6510:207] url : (null) 
2011-08-11 14:56:06.879 Tab_Table_Win[6510:207] IMage : (null) 
2011-08-11 14:56:06.881 Tab_Table_Win[6510:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary setObject:forKey:]: attempt to insert nil key' 
+0

यह सटीक त्रुटि क्या है, और किस कोड के लिए कोड? – Chuck

+0

मैंने ऊपर अपना कोड संपादित किया है। – lifemoveson

+0

मेरा जवाब जांचें।इसे एक आईडी में भेजकर उसे कास्ट करके आप स्मृति को बर्बाद कर रहे हैं, यद्यपि बहुत कम। आप इसे एक लाइन कर सकते हैं। मेरी इच्छा है कि आईओएस की चाबियाँ जैसे नेट। –

उत्तर

2
NSDictionary *result; 
NSString *myImageURL = [result objectForKey:@"url"]; 
if (myImageURL == NULL) 
    myImageURL = @""; 

NSString *myImage = [result objectForKey:@"image"]; 
if (myImageURL == NULL) 
    myImage = @""; 

देखें कि अगर, काम करता है बल्कि शून्य वर्ग overthinking से।

+0

नोप्स। मैंने एनएसएलओजी किया और मुझे यह जवाब मिल गया: परिणाम: { } और फिर यह टूट जाता है। कोई विचार नहीं क्या अभी तक गलत है? – lifemoveson

+0

आपने myImageURL पर एक NSLog किया था? शून्य के लिए चेक से पहले? मैं पहले और बाद में जांच करूँगा। एनएसएलओजी (@ "परिणाम:% @", [परिणाम ऑब्जेक्टफोरकी: @ "यूआरएल"]); एनएसएलओजी (@ "myImageURL:% @", myImageURL); –

6

जब भी मैं जाँच करने के लिए कोशिश करता है, तो एक वस्तु एक शब्दकोश से लौटाए जाने अशक्त, मैं यह कर रहा है:

id obj = [myDictionary objectForKey:entityKeyName]; 
if (obj == [NSNull null]) { 
    // do something 
} 
अपने कोड में

फिर, यह होगा:

NSDictionary *result; 
NSString *myImageURL = [result objectForKey:@"url"]; 
if (myImageURL == [NSNull null]) 
    myImageURL = @""; 

कि क्या मैं आपके कोड में होगा।

इसके अलावा, बस सुनिश्चित करना, NSDictionary परिणाम परिभाषित किया गया है? आपके कोड में, इसमें कुछ भी नहीं है जिसे इसे सेट किया जा रहा है। इसे केवल वेरिएबल के रूप में परिभाषित किया गया है जिसे आप

+0

यू को किसी भी एनएसएसटींग के लिए एनएसएनयूएल के साथ जाति करने की आवश्यकता है। – lifemoveson

4

का उपयोग करने की योजना बनाते हैं यदि कोई ऑब्जेक्ट किसी कुंजी के लिए मौजूद नहीं है, तो NSDictionary nil लौटाएगा। एक NSNull एक वास्तविक वस्तु है, और इसलिए एक अलग बात है। यह रिकॉर्ड करने में सक्षम होने के बीच भेद की तरह है कि एक मूल्य और मूल्य शून्य के रूप में था, और रिकॉर्ड नहीं किया गया था कि कोई मूल्य था या नहीं। यह किसी ऑब्जेक्ट की बजाय ऑब्जेक्ट में पॉइंटर के संकेत के सी शर्तों में सोचने पर थोड़ा सा भी आराम करता है, इसलिए यह उस परिप्रेक्ष्य से पूरी तरह से अर्थपूर्ण रूप से प्रसन्न नहीं है।

उद्देश्य-सी में, आप nil पर कोई संदेश भेज सकते हैं और परिणाम nil (या 0) होने की गारंटी है। इसलिए यदि आपका कोड यह सुनिश्चित करने के लिए डिज़ाइन किया गया है कि आपके पास सुरक्षित ऑब्जेक्ट संदर्भ है, जैसा कि आप C++ में हो सकते हैं, तो आप जो भी कर रहे हैं वह अनावश्यक है। यौगिक बयान की तरह:

object = [[Type alloc] init]; 

, हमेशा स्पष्ट रूप से सुरक्षित हैं, भले ही alloc विफल रहता है और nil देता है। यह सब कुछ होगा कि init पर कॉल कुछ भी नहीं करेगा, और ऑब्जेक्ट nil के साथ समाप्त हो जाएगा क्योंकि init से nil भेजने का नतीजा nil भी है।

कहा जा रहा है कि बिल और इमानुअल द्वारा प्रदान किए गए उत्तरों सही होना चाहिए। अपने परिणाम की तुलना सीधे या तो nil या शून्य से पूरी तरह से करें। अगर आपको बाद में कोई दुर्घटना हो रही है, तो मुझे लगता है कि आप myImageUrl और myImageNSString के अलावा अन्य प्रकार के होने की उम्मीद कर रहे हैं (मुझे लगता है कि आपने अपने मूल कोड में टाइपलेस id का उपयोग किया है) और उन्हें एक संदेश भेजना जवाब न दें।

13

सही जवाब है:

NSDictionary *result; 
NSURL *myImageURL = [result objectForKey:@"url"]; 
UIImage *myImage = [result objectForKey:@"image"]; 

/**** Correct way ****/ 
if (myImageURL != nil && myImage != nil) { 
    [images setObject:myImage forKey:myImageURL]; 
} 

सभी स्पष्टीकरण के लिए धन्यवाद।

+1

क्या आप इसे समझा सकते हैं? – lifemoveson

2

इस एक और विकल्प:

if (![result objectForKey:@"image"]) 
    { 
     NSLog(@"doesn't exist"); 
    } 
    if ([result objectForKey:@"image"]) 
    { 
     NSLog(@"exist"); 
    } 
1

कि मेरे लिए काम नहीं किया गया था, मैं इसे इस

id myImageURL = [result objectForKey:@"url"]; 
if ([myImageURL isKindOfClass:[NSNull class]]) 
    myImageURL = @""; 
1

की तरह पता लगा यहाँ ठीक वास्तविक जवाब जो @Iomec लगभग

UIImage *myImage = ([result objectForKey:@"image"] != [NSNull null] ? [result objectForKey:@"image"] : nil); 
था है

यह वास्तविक सही उत्तर है क्योंकि, यह शून्य के रूप में आता है और जब आप myImage = [प्राप्तObject ...] कहते हैं; तो अगर myImage = nil, तो आप एक कक्षा में एक शून्य मान (शून्य) कास्टिंग कर रहे हैं जो एक अपवाद है, अगर कोई चल रहा बग नहीं है।

आप को: 1) NSNull शून्य मान 2) नहीं करता है, तो उसके बाद आवंटित नहीं के बराबर

आप कोड अभी तक बाहर bugged नहीं किया है, यह उत्पादन में होगा आप 8 क्षुधा पृष्ठभूमि में चल रहा है जब के लिए परीक्षण एक दिन।

0

मुझे JSONKit के साथ एक ही समस्या मिली। कार्यान्वयन

- (id)objectForKey:(id)aKey 
{ 
    [...] 
    return((entryForKey != NULL) ? entryForKey->object : NULL); 
} 

तो यदि वस्तु वहां नहीं है तो यह निश्चित रूप से शून्य वापस आ जाएगा। मैं निम्नलिखित

NSArray* array = [myDictionary objectForKey:@"a"]; 
if((NSNull*)arrays!=[NSNull null]) 
{ 
    [...] 
} 
7

उत्तर की तरह यह जाँच मेरे लिए काम किया नीचे:

https://stackoverflow.com/a/2784675/936957

if ([dictionary objectForKey:key]) { 
    // previously stored data for "key" 
} 

भी ध्यान रखें कि आप का उपयोग कर एक शब्दकोश में चाबियों का सरणी प्राप्त कर सकते हैं

[dictionary allKeys] 
+0

यह सबसे अच्छा जवाब है, यदि शब्दकोश में कुंजी भी नहीं है तो चारों ओर लटकने वाले चर के लिए कोई आवश्यकता नहीं है। अगर इसे कथन में सेट करें। +1 –

+0

ऐसा लगता है कि यह काम करेगा, लेकिन ऐसा नहीं है। ऑब्जेक्टफोरकी अभी भी सच हो जाता है अगर NSNull null – quantumpotato

+0

@quantumpotato, NSDictionary: objectForKey: शून्य में वापस आता है, यदि कुंजी शब्दकोश में मौजूद नहीं है, तो [NSDictionary के लिए क्लास संदर्भ] देखें (https://developer.apple.com/library/ मैक/प्रलेखन/कोको/संदर्भ/फाउंडेशन/कक्षाएं/NSDictionary_Class/# // apple_ref/occ/instm/NSDictionary/objectForKey :)। फिर भी, मैंने इसका परीक्षण किया है, समस्या के बिना काम कर रहा है –

11

टॉमी ने इसे पूरी तरह से समझाया।

#import <Foundation/Foundation.h> 

@interface NSDictionary (Safety) 

- (id)safeObjectForKey:(id)aKey; 

@end 

और कार्यान्वयन फ़ाइल:

क्या मेरा सुझाव है की तरह NSDictionary वर्ग के लिए एक्सटेंशन बना है,

#import "NSDictionary+Safety.h" 

@implementation NSDictionary (Safety) 

- (id)safeObjectForKey:(id)aKey { 
    NSObject *object = self[aKey]; 

    if (object == [NSNull null]) { 
    return nil; 
    } 

    return object; 
} 

@end 

और बजाय अपने कोड में [dictionary objectForKey:@"keyName"]; का उपयोग करने का उपयोग करें

[dictionary safeObjectForKey:@"keyName"]; 

इस तरह, जैसा कि टॉमी ने समझाया, आप एक शून्य कॉल करने के लिए एक विधि कॉल भेज रहे होंगे I ऐप को क्रैश नहीं करेगा लेकिन आपकी ऑब्जेक्ट को शून्य मान मिलेगा।

उम्मीद है कि इससे मदद मिलती है।

0
 1. Results Dictionary after JSON parsing: 

     //if hits success 

     {"result":{"action":"authentication","statusCode":"200","statusMsg":"No 
     error, operation 
     successful.","count":1,"data":{"apiToken":"509e6d21-4f69-4ded-9f3d-4537e59e6a3a","userId":8,"role":"Bidder","firstName":"bidder","lastName":"bidder","emailAddress":"[email protected]","countiesCovered":"21,16,11,1,2,14,32,3,4,25,13,15,5,41,43,6,12,7,24,39,17,36,42,44,29,40,8,18,19,27,9,28,23,10,33,26,35,20,30,22,34,31"}}} 

//Data is Dictionary inside Result 


----------------------------------------------------------------------- 
      I had an error showing : NULL DATACould not cast value of type 'NSNull' (0xda7058) to 'NSDictionary' (0xda6d74) and the result was 
     the following. 

      ({"result":{"action":"authentication","statusCode":"204","statusMsg":"Invalid 
     Username or Password","count":null,"data":null}}) 

      I fixed the Null check of dictionary. 

           if (result.objectForKey("data") is NSNull) 
           { 
      print ("NULL DATA") 

           } 
           else 
           { 
            let data = result["data"]as! NSDictionary 
            print (data) 

           } 
0

यह सुनिश्चित करने के लिए थोड़ा और सुरक्षा जोड़ना चाहता है कि यह जांचने के बजाय यह एक स्ट्रिंग नहीं है कि यह शून्य है या नहीं। (यह सुनिश्चित करने के लिए कि यह कोई संख्या या कुछ और नहीं है जिसे आप नहीं चाहते हैं।)

id myImageURL = [result objectForKey:@"url"]; 
if (![myImageURL isKindOfClass:[NSString class]]) { 
    myImageURL = @""; 
}