मुझे ऑब्जेक्टिव-सी में नील और NULL का उपयोग कब करना चाहिए?


170

यह नमूना कोड है:

NSDictionary *myDictionary = [NSDictionary dictionary];
NSNumber *myNumber = [myDictionary valueForKey: @"MyNumber"];
NSLog(@"myNumber = %@", myNumber); // output myNumber = (null)

if (myNumber == nil)
    NSLog(@"test 1 myNumber == nil");

if (myNumber == NULL)
    NSLog(@"test 2 myNumber == NULL");

if ([myNumber isEqual:[NSNull null]])
    NSLog(@"test 3 myNumber == [NSNull null]");

मुझे nil, NULL और [NSNull null] का उपयोग कब करना चाहिए?


4
इसका उद्देश्य Object C से संबंधित है।
बिरंची

nilNULLobjc उदाहरण के लिए एक प्रकार का मतलब है । तो आप चिह्नित कर सकते हैं विशिष्ट मान objc उदाहरण या सामान्य सूचक के लिए अभिप्रेत है। प्रकार प्रबंधन और सुरक्षा के मद्देनजर, यह आपकी बहुत मदद करेगा।
eonil

4
nilऔर null/ NULLसमान हैं - दोनों को शून्य के रूप में परिभाषित किया गया है। औपचारिकता के तौर पर, nilऑब्जेक्टिव-सी कोडिंग करते समय और NULLनियमित C / C ++ स्टेटमेंट / कॉल कोड करते समय उपयोग करें । NSNullहालांकि कुछ पूरी तरह से अलग है। यह एक सिंगलटन ऑब्जेक्ट है, जो "कुछ भी नहीं" का प्रतिनिधित्व करने के लिए एक जगह-धारक के रूप में कार्य करता है, उदाहरण के लिए, एनएसड्रॉबल्स जहां शून्य / शून्य पॉइंटर्स की अनुमति नहीं है।
हॉट लिक्स

: अच्छा स्पष्टीकरण [यहां] [1] [1] के लिए लिंक का संदर्भ लें stackoverflow.com/questions/5908936/...
अमीर

जवाबों:


114

आप nilकहीं भी उपयोग कर सकते हैं null। मुख्य अंतर यह है कि आप संदेशों को भेज सकते हैं nil, इसलिए आप इसे कुछ स्थानों पर उपयोग कर सकते हैं जहां nullखिचड़ी भाषा का काम होता है।

सामान्य तौर पर, बस उपयोग करें nil


12
तकनीकी रूप से, वे बिल्कुल समान हैं, आप दोनों NIL और NULL को संदेश भेज सकते हैं। आमतौर पर हालांकि शून्य का उपयोग आमतौर पर किसी वस्तु का प्रतिनिधित्व करने के लिए किया जाता है
कोबल

41
इसके अलावा, MacTypes.h में है#define nil NULL
कोबाल

8
हाँ, जैसा कि कोबाल कहते हैं, वे एक ही हैं। यह अधिक प्रासंगिक संदर्भ है जहां NULL 0x0 का सूचक है, nil एक गैर-मौजूद उद्देश्य-सी ऑब्जेक्ट है और Nil एक गैर-मौजूद उद्देश्य-c वर्ग है, लेकिन तकनीकी रूप से वे सभी केवल 0. हैं, यह NULL नहीं है null - null Java या C # में है लेकिन Object-C में नहीं है।
जेसन कोको

16
यह स्वीकार किया गया उत्तर यह स्वीकार करने में विफल रहता है कि [NSNull null]यह बहुत अलग जानवर है। NSNull क्लास रेफरेंस से उद्धृत करने के लिए , "NSNull क्लास एक सिंगलटन ऑब्जेक्ट को परिभाषित करती है जिसका उपयोग संग्रह ऑब्जेक्ट्स में शून्य मानों को दर्शाने के लिए किया जाता है (जो शून्य मानों की अनुमति नहीं देते हैं)।" संख्या और मान प्रोग्रामिंग विषयों के NSNull अनुभाग का उपयोग करना भी देखें
रॉब

"मुख्य अंतर यह है कि आप निल्स को संदेश भेज सकते हैं" - आप संदेशों को भी भेज सकते हैं NULL

313

वे अपने प्रकारों में भिन्न होते हैं। वे सभी शून्य हैं, लेकिन NULLएक है void *, nilएक है id, और Nilएक क्लास पॉइंटर है।


14
सबसे अच्छा विवरण मैंने अंतर के बारे में सुना है: (धन्यवाद।
याकूब

3
यह स्वीकृत उत्तर होना चाहिए, इसलिए नहीं कि अधिक वोट हैं, बल्कि इसलिए कि इसमें प्रश्न का सबसे अच्छा स्पष्टीकरण है।
जेम्स मर्ट्ज़

5
NULLवी का सुरुचिपूर्ण विवरण nil, लेकिन यह गंभीरता से मार्क री को याद करता है [NSNull null]संख्या और मान प्रोग्रामिंग विषयों के NSNull अनुभाग और NSNull वर्ग संदर्भ का उपयोग करना देखें ।
रोब

दोनों इशारा करने लगते हैं void *। यहां एक अलग उत्तर में पहले से ही इसका उल्लेख है, लेकिन अगर आप खोदते हैं objc.h, तो आप लाइन पाएंगे #define nill __DARWIN_NULL
gkb0986

1
यह उत्तर अच्छा लगता है लेकिन अन्य उत्तरों के अनुसार यह केवल गलत है।
n13

30

शून्य एक वस्तु के साथ एक खाली मूल्य बाउंड / संगत है (ऑब्जेक्टिव-सी में आईडी प्रकार)। शून्य को कोई संदर्भ / पता नहीं मिला, बस एक खाली मान।

NSString *str = nil;

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

if(str==nil)
    NSLog("str is empty");

अब NULL का उपयोग Objective-C में नॉन-ऑब्जेक्ट पॉइंटर (C पॉइंटर की तरह) के लिए किया जाता है। शून्य की तरह , NULL को कोई मूल्य नहीं मिला और न ही पता।

char *myChar = NULL;
struct MyStruct *dStruct = NULL;

इसलिए अगर कोई स्थिति है, जब मुझे अपनी संरचना (संरचना प्रकार चर) की जांच करने की आवश्यकता है, तो खाली है या नहीं, मैं उपयोग करूंगा:

if (dStruct == NULL)
    NSLog("The struct is empty");

चलो एक और उदाहरण है,

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

की कुंजी-मान अवलोकन , संदर्भ एक सी सूचक या किसी वस्तु संदर्भ होना चाहिए। यहाँ संदर्भ के लिए हम शून्य का उपयोग नहीं कर सकते हैं ; हमें NULL का उपयोग करना होगा ।

अंत में NSNull वर्ग एक एकल वस्तु को परिभाषित करता है जिसका उपयोग संग्रह वस्तुओं (NSArray, NSDictionary) में शून्य मानों का प्रतिनिधित्व करने के लिए किया जाता है। [NSNull अशक्त] होगा रिटर्न NSNull की सिंगलटन उदाहरण। मूल रूप से [NSNull null] एक उचित वस्तु है।

एक संग्रह प्रकार ऑब्जेक्ट में एक नील वस्तु डालने का कोई तरीका नहीं है। चलो एक उदाहरण है:

NSMutableArray *check = [[NSMutableArray alloc] init];
[check addObject:[NSNull null]];
[check addObject:nil];

दूसरी पंक्ति में, हमें कोई त्रुटि नहीं मिलेगी, क्योंकि एक NSNull ऑब्जेक्ट को एक संग्रह प्रकार ऑब्जेक्ट में सम्मिलित करना पूरी तरह से उचित है। तीसरी पंक्ति में, हमें "ऑब्जेक्ट एनआईएल नहीं हो सकता" त्रुटि मिलेगी। क्योंकि नील कोई वस्तु नहीं है।


सरणी में शून्य / अशक्त के व्यावहारिक उपयोग का उल्लेख करने के लिए +1।
माइकल

19

NULL और NIL एक दूसरे के बराबर हैं, लेकिन NIL एक ऑब्जेक्ट वैल्यू है जबकि NULL एक जेनेरिक पॉइंटर वैल्यू है ( (void*)0, विशिष्ट होने के लिए)। [NSNull null]एक ऐसी वस्तु है जो उन स्थितियों में शून्य के लिए खड़ी होती है जहां शून्य की अनुमति नहीं है। उदाहरण के लिए, आप NSArray में शून्य मान नहीं रख सकते। इसलिए यदि आपको "नील" का प्रतिनिधित्व करने की आवश्यकता है, तो आप उपयोग कर सकते हैं [NSNull null]


12

मैंने निम्नलिखित पाया है:

objc.h

#define Nil __DARWIN_NULL   /* id of Nil class */
#define nil __DARWIN_NULL   /* id of Nil instance */

_types.h

#define __DARWIN_NULL ((void *)0)

stddef.h

#undef NULL
#ifdef __cplusplus
#undef __null  // VC++ hack.
#define NULL __null
#else
#define NULL ((void*)0)
#endif

MacTypes.h

#ifndef NULL
#define NULL    __DARWIN_NULL
#endif /* ! NULL */
#ifndef nil
    #define nil NULL
#endif /* ! nil */

जिस तरह से यह दिखता है, कोई अंतर नहीं है, लेकिन एक वैचारिक है।



7

वे दोनों सिर्फ टाइपकास्ट शून्य के हैं। कार्यात्मक रूप से, उनके बीच कोई अंतर नहीं है। अर्थात।,

#define NULL ((void*)0)
#define nil ((id)0)

एक अंतर है, लेकिन केवल अपने और अन्य मनुष्यों के लिए जो कोड पढ़ते हैं, संकलक परवाह नहीं करता है।

एक और बात शून्य वस्तु का मूल्य है जबकि NULL एक सामान्य सूचक मान है।


6

आधुनिक ओएस एक्स और आईओएस एसडीके में:

  • nilऔर Nilऔर NULLऑब्जेक्टिव-सी में समान और ऑब्जेक्टिव-सी ++ से पहले सी ++ 11 में हैं।
  • nilऔर Nilऔर std::nullptrऑब्जेक्टिव-सी ++ सी ++ 11 के साथ में समान हैं।

शैलीगत, कई लोगों का उपयोग करना पसंद nilऑब्जेक्टिव-सी वस्तुओं के लिए और NULLया nullptrअन्य सूचक प्रकार के लिए। मैं खुद अब nilहर जगह उपयोग करता हूं ।

[NSNull null]एक सिंगलटन ऑब्जेक्ट का उपयोग उन स्थितियों में अशक्त मूल्यों का प्रतिनिधित्व करने के लिए किया जाता है जहां nilमूल्य के रूप में निषिद्ध है (आमतौर पर संग्रह वस्तु जैसे NSArrayया NSDictionary)। संख्या और मूल्य प्रोग्रामिंग विषय: NSNull का उपयोग करना



4

जैसा कि पहले ही उल्लेख किया गया है, वे समान हैं, लेकिन मैं उस भाषा के आधार पर एक या दूसरे का उपयोग करता हूं जिसमें संबंधित रूपरेखा लिखी गई थी।

ऑब्जेक्टिव-सी से जुड़ी हर चीज के लिए मैं नील का इस्तेमाल करता हूं। उदाहरण के लिए:

- (BOOL)doSomethingWithObjectsInArray:(NSArray *)anArray {
    if (anArray == nil) return NO;

    // process elements
    ...
}

हालांकि, जब C- फ्रेमवर्क (जैसे एड्रेसबुक फ्रेमवर्क और CoreFoundation) से डेटा मॉडल की वैधता की जांच करते हैं, तो मैं NULL का उपयोग करता हूं। उदाहरण के लिए:

- (BOOL)showABUnknownPersonVCForABRecordRef:(ABRecordRef)aRecord {
    if (aRecord == NULL) return NO;

    // set-up the ABUnknownPersonViewController and display it on screen
    ..
}

इस तरह, मेरे पास मेरे कोड में सूक्ष्म सुराग हैं यदि मैं ओबज-सी या सी आधारित कोड के साथ काम कर रहा हूं।


4

शून्य कुछ भी नहीं करने के लिए एक वस्तु सूचक है। यद्यपि NULL से शब्दार्थ भिन्न है , वे तकनीकी रूप से एक दूसरे के समतुल्य हैं ।

फ्रेमवर्क के स्तर पर, फाउंडेशन NSNull को परिभाषित करता है , जो एक क्लास मेथड, + null को परिभाषित करता है, जो सिंगलटन NSNull ऑब्जेक्ट को लौटाता है। NSNull शून्य या NULL से भिन्न है , इसमें यह शून्य मान के बजाय एक वास्तविक वस्तु है

इसके अतिरिक्त, फाउंडेशन / NSObjCRuntime.h में, निल को क्लास पॉइंटर के रूप में परिभाषित किया जाता है ।

इसे आगे की जानकारी के लिए देखें - nil / Nil / NULL / NSNull


3

कुछ संदर्भों में अंतर है।

वस्तुतः, नल एक चरित्र है: ASCII 0।

शून्य रिक्त के बराबर है, कोई मूल्य नहीं।

प्रोग्रामिंग संदर्भ के आधार पर, यह एक बड़ा अंतर हो सकता है।


1

उदाहरण के लिए NULL का उपयोग करें जब आप प्रकार के आउटपुट पैरामीटर (NSError **) के साथ ऑब्जेक्टिव-सी विधि लागू करते हैं।

मैं वेब पर बहुत सारे उदाहरण कोड देखता हूं जहां लोग इस मामले में NULL के बजाय शून्य प्रदान करते हैं। ऐसा इसलिए है क्योंकि यह एक पॉइंटर को पॉइंटर है और इस प्रकार सीधे एक ऑब्जेक्टिव-सी ऑब्जेक्ट प्रकार नहीं है। जैसा कि ऊपर कहा गया है, नील का उपयोग ऑब्जेक्टिव-सी ऑब्जेक्ट प्रकारों के लिए किया जाना चाहिए।


1

मूल रूप से: nil: null पॉइंटर एक ऑब्जेक्ट पर और null: अन्य प्रकार के पॉइंटर के लिए है


0

शून्य का अर्थ है मूल्य का अभाव, जबकि NULL कोई वस्तु नहीं दर्शाता है,

NSArray * array = @ [@ "हैलो वर्ल्ड!", @ 101, [NSNULL null]];

यहाँ [NSNULL null] एक ऑब्जेक्ट है जिसका अर्थ है कोई ऑब्जेक्ट नहीं, उसी समय आप ऑब्जेक्ट की अनुपस्थिति को इंगित करने के लिए nil नहीं जोड़ सकते।

आप जाँच के लिए nil और [NSNUll null] दोनों का उपयोग कर सकते हैं।


0

यह आपको एनआईएल, एनआईएल और शून्य के बीच के अंतर को समझने में मदद करेगा।

नीचे दिए गए लिंक से आपको किसी तरह से मदद मिल सकती है:

http://nshipster.com/nil/

शून्य -> ​​उद्देश्य-सी वस्तुओं के लिए शाब्दिक अशक्त मान।

निल -> उद्देश्य-सी कक्षाओं के लिए शाब्दिक अशक्त मूल्य।

N पॉइंट -> सी पॉइंटर्स के लिए शाब्दिक अशक्त मान।

NSNULL -> सिंगलटन ऑब्जेक्ट नल का प्रतिनिधित्व करने के लिए उपयोग किया जाता है।


क्या यह कुछ नया जोड़ता है (जो मौजूदा उत्तरों द्वारा कवर नहीं किया गया है)?
फ्लोरियन कोच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.