2009-05-07 18 views
40

यहाँ एक संदर्भ में, जहां मुझे लगता है कि देखा है:[NSNull शून्य] और शून्य के बीच क्या अंतर है?

NSMutableArray *controllers = [[NSMutableArray alloc] init]; 
for (unsigned i = 0; i < kNumberOfPages; i++) { 
    [controllers addObject:[NSNull null]]; 
} 

क्यों नहीं उस जगह में नहीं के बराबर?

+2

इससे बेहतर नहीं मिलता ---> http://nshipster.com/nil/ –

उत्तर

77
Apple से सीधे

:

NSNull वर्ग (जैसे किसी सरणी या एक शब्दकोश के रूप में आम तौर पर एक संग्रह वस्तु में) एक सिंगलटन वस्तु आप स्थितियों में शून्य मान का प्रतिनिधित्व करने के जहां शून्य एक मूल्य के रूप में निषिद्ध है का उपयोग को परिभाषित करता है ।

तो आपके उदाहरण में, यह ठीक है कि क्या हो रहा है, प्रोग्रामर नियंत्रक सरणी में एक शून्य वस्तु डालने का चयन कर रहा है, जहां शून्य को मूल्य के रूप में अनुमति नहीं है।

10

आप nil मान NSArray या NSMutableArray पर जोड़ नहीं सकते हैं। यदि आपको nil मान स्टोर करने की आवश्यकता है, तो आपको उस स्निपेट में दिखाए गए अनुसार NSNull रैपर क्लास का उपयोग करने की आवश्यकता है। यह documentation में निर्दिष्ट है।

8

संग्रह कक्षाएं जैसे NSArray और NSDictionary में nil मान नहीं हो सकते हैं। NSNULL विशेष रूप से nil के लिए प्लेसहोल्डर के रूप में बनाया गया था। इसे संग्रह कक्षा में रखा जा सकता है, और केवल स्थान लेता है।

NSNull एक सिंगलटन ऑब्जेक्ट को परिभाषित करता है, जिसका अर्थ है कि एनएसएनयूएल का केवल एक ही उदाहरण है (जिसे आप [NSNull null] का उपयोग करके बनाते हैं), लेकिन इसका उपयोग जितनी चाहें उतनी जगहों में किया जा सकता है।

-11

शून्य ऑब्जेक्ट की श्रृंखला के बाद एक सरणी की समाप्ति का सूचक ...

+9

नहीं, इस मामले में नहीं। यह जवाब सिर्फ सादा गलत है। – Palimondo

6

हम सब सहमत हैं कि [NSNull अशक्त] एक प्लेसहोल्डर जहां एक वस्तु की आवश्यकता है, जैसा कि ऊपर सविस्तार के रूप में उपयोगी है। लेकिन जब तक कि यह स्पष्ट रूप से आपके ऑब्जेक्ट के लिए असाइनमेंट में उपयोग नहीं किया जाता है, इसे तुलना में इस्तेमाल नहीं किया जाना चाहिए, जो मैंने पहले किया था।

id a; 
NSLog(@"Case 1"); 
if (a == nil) NSLog(@"a == nil"); 
if (a == Nil) NSLog(@"a == Nil"); 
if ([a isEqual:[NSNull null]]) NSLog(@"a isEqual:[NSNull null]"); 

NSLog(@"Case 2"); 
a = [NSNull null]; 
if (a == nil) NSLog(@"a == nil"); 
if (a == Nil) NSLog(@"a == Nil"); 
if ([a isEqual:[NSNull null]]) NSLog(@"a isEqual:[NSNull null]"); 

आउटपुट:

2014-01-31 10: 57: 11.179 MCDocsApp [13,266: a0b] प्रकरण 1

2014-01-31 10: 57: 11.179 MCDocsApp [13,266: a0b ] एक == शून्य

2014-01-31 10: 57: 11.179 MCDocsApp [13,266: a0b] एक == शून्य

2014-01-31 10: 57: 11.180 MCDocsApp [13,266: a0b] केस 2

2014-01-31 10: 57: 11.180 एमसीडीओक्सएप [13266: ए0 बी] एक आईक्वाल: [एनएसएनुल नल]

+2

'- [NSObject isEqual:]' NSNull के साथ एक objc ऑब्जेक्ट की तुलना करने के लिए सही और अनुशंसित विधि है। –

+0

नई-आवंटित एनएसओब्जेक्ट्स अपनी सामग्री के साथ 0 से सेट शुरू करते हैं। इसका मतलब यह है कि ऑब्जेक्ट्स के सभी ऑब्जेक्ट्स को अन्य ऑब्जेक्ट्स के रूप में शुरू होता है, इसलिए यह अनावश्यक है, उदाहरण के लिए, स्वयं को सेट करें। (एसोसिएशन) = nil init विधियों में ।1 के मामले में, "ए" में डिफ़ॉल्ट मान 0 होता है जो शून्य/शून्य इंगित करता है और दूसरे मामले के लिए आप सिंगलटन ऑब्जेक्ट को शून्य का प्रतिनिधित्व करने के लिए उपयोग करते हैं, यही कारण है कि यह शून्य शून्य नहीं है। –

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