2011-12-22 12 views
7

मैं एक पाशपरीक्षण में ऑब्जेक्टिव-सी अशक्त के लिए

NSArray * images = [definitionDict objectForKey:@"Images"]; 
    NSLog(@"images in definitionDict %@", images); 
    if (!images) 
     NSLog(@"NULL"); 
    else 
     NSLog(@"NOTNULL"); 

जो निम्नलिखित आउटपुट

images in definitionDict (
    "/some/brol/brol.jpg" 
) 
NOTNULL 
images in definitionDict <null> 
NOTNULL 

मैं दूसरे मामले में, जहां छवियों सरणी है समझ में नहीं आता देता में निम्न कोड है शून्य। मेरे परीक्षण में यह सही ढंग से क्यों नहीं पता चला है? मैं ऐसी समस्या कैसे डीबग कर सकता हूं?

उत्तर

19

<null>nil नहीं है। nil(null) प्रिंट जब मुद्रित होगा। आपके पास NSNull है। NSNull एक वस्तु है, यह बहुत अधिक प्रतिक्रिया नहीं देता है। यह आपके लिए उपयोग करने के लिए प्लेसहोल्डर के रूप में उपलब्ध है।

NSNull के लिए परीक्षण आप if ([images isEqual:[NSNull null]])

उपयोग कर सकते हैं NSNull

+0

धन्यवाद, यह मेरे लिए हल हो गया। – madewulf

1

बारे में अधिक जानकारी के लिए docs देखें तुम बाहर एक ऑब्जेक्टिव-सी वस्तु की स्मृति पता, या किसी अन्य सूचक प्रिंट करना चाहते हैं, तो आप करने के लिए झंडा %p नहीं %@ उपयोग करना चाहिए। ध्वज %@, एक स्ट्रिंग की अपेक्षा करता है।

हालांकि अगर तर्क स्ट्रिंग नहीं है, तो NSLog पास ऑब्जेक्ट पर -description स्वचालित रूप से कॉल करेगा। और जब विधि एक NSNull वस्तु देता है, उस वस्तु पर -description स्ट्रिंग रिटर्न <null>

NSObject *o = nil; 
NSLog(@"%p", o); 

आउटपुट:0x00000000

NSObject *o = [[NSObject alloc] init]; 
NSLog(@"%p", o); 
[o release]; 

आउटपुट:0x12345678 की तरह कुछ

मन:

NSNull *n = [NSNull null]; 
NSLog(@"%p", n); 

आउटपुट: एक स्मृति पता है कि हमेशा एक ही होगा, लेकिन से 0x00000000

सही तरीका अलग परीक्षण करने के लिए होगा अगर उनकी वस्तुओं रहे हैं में सरणी इस तरह है।

NSArray *myArray = [someObject array]; 
if([myArray isEqual:[NSNull null]]) { 
    NSLog(@"No objects"); 
} else { 
    NSLog(@"%d objects.", (int)[myArray length]; 
} 
+1

नीचे स्थित आपका समाधान इस स्थिति में दुर्घटनाग्रस्त हो जाएगा। यह एक सरणी नहीं है जिसमें कोई वस्तु नहीं है। यह एक एनएसएनयूएल है, और एनएसएनयूएल लंबाई का जवाब नहीं देता है। –

+0

@ जोशुआ वेनबर्ग मैंने इसे संपादित किया। यह अभी भी एक रहस्य की तरह प्रतीत होता है कि ऐप्पल ने 'एनएसएनयूएल' कक्षा क्यों बनाई। और विशेष रूप से क्यों एक NSNull ऑब्जेक्ट को 'NSDictionary' में सेट करेगा। यदि आप कुंजी को परिभाषित नहीं करेंगे, तो विधि अभी भी 'शून्य 'वापस आ जाएगी। – v1Axvw

+0

इस मामले में, आप कोई वस्तु हो रही है, छंद एक अशक्त वस्तु होने भेद करने में सक्षम होने की जरूरत है। 'शून्य 'सिर्फ शून्य है, अगर कुंजी मौजूद नहीं है तो यह भी वापस आ रहा है। तो यहाँ, मैं एक शब्दकोश है जो इसे में एक JSON 'null' था में कुछ JSON को पार्स के बाद कल्पना, एक' NSNull' बनाया गया था। –

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