ऑब्जेक्टिव-सी में NULL बनाम नील


182

में observeValueForKeyPath:ofObject:change:context:- क्यों दस्तावेज़ों का उपयोग कर NULLके बजाय nilजब एक संदर्भ सूचक को निर्दिष्ट नहीं?


मेरी राय में, ऑब्जेक्ट nil है, क्लास Nil है, और NULL ऑब्जेक्ट या क्लास के लिए उपयोग कर रहा है
Thanh Vũ Tr'n

जवाबों:


227

nilकेवल एक के स्थान पर उपयोग किया जाना चाहिए id, जिसे हम जावा और सी ++ प्रोग्रामर एक वस्तु के लिए एक संकेतक के रूप में सोचेंगे। NULLगैर-ऑब्जेक्ट पॉइंटर्स के लिए उपयोग करें ।

उस विधि की घोषणा को देखो:

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

संदर्भ एक void *(यानी सी-शैली सूचक) है, इसलिए आप निश्चित रूप से उपयोग करेंगे NULL(जो कि कभी-कभी के रूप में घोषित किया जाता है (void *)0) nil(जो कि प्रकार का है id)।


2
लेकिन चूंकि के प्रकार contextमें observeValueForKeyPath:ofObject:change:context:है void *, यह नहीं है कि मतलब डेटा के रूप में पारित कर दिया है कि contextएक वस्तु सूचक हो सकता है? मुझे लगता है कि एक सामान्य मामला होगा। इसीलिए मैं उलझन में हूं कि डॉक्स हमेशा के NULLबजाय क्यों इस्तेमाल करते हैं nil
इरिकप्राइस

2
संदर्भ का प्रकार: उस पद्धति में "शून्य *" है। "नील" एक "शून्य *" नहीं है, लेकिन NULL है।
पॉल टॉम्बलिन

3
आप ऐसा कर सकते हैं। शून्य * कोई सूचक है। बहरहाल, आप पूरी तरह से सही हैं कि NULL वहां सही स्थिरांक है।
पीटर होसी

3
उन्होंने कहा शून्य *। NULL शून्य * के लिए है और nil id के लिए है। इसलिए, आप NULL को पास करते हैं। यदि आप शून्य पास करते हैं, तो आप अपने पाठक से झूठ बोल रहे हैं, जो सोचेंगे कि यह विधि एक आईडी लेती है।
पीटर होसी

12
या इसे दूसरे तरीके से सोचने के लिए, NULL एक व्यापक प्रकार है, और NULL NULL का सबसेट है। सामान्य तौर पर, आपके द्वारा दूर किए जा सकने वाले व्यापक प्रकार का उपयोग करें (यानी जावा में, वेक्टर के बजाय एक संग्रह की अपेक्षा करने के लिए अपनी विधि लिखें, जब तक आपको वेक्टर से कुछ विशिष्ट की आवश्यकता न हो)
पॉल टॉम्बलिन

65

वे तकनीकी रूप से एक ही चीज़ (0) हैं, लेकिन nil आमतौर पर एक ऑब्जेक्टिव-सी ऑब्जेक्ट प्रकार के लिए उपयोग किया जाता है, जबकि NULL का उपयोग सी-स्टाइल पॉइंटर्स (शून्य *) के लिए किया जाता है।


8
इसके अलावा, NULLअलग से परिभाषित किया गया है nilnilके रूप में परिभाषित किया गया है (id)0NULLनहीं है।

14
अगर आप MacTypes.h के माध्यम से पढ़ते हैं, तो यह #TPfine nil NULL
jbat100

1
वो बहुत रुचिकर है। ऐसा लगता है कि यह स्टाइल पॉइंट्स के अलावा और कोई मायने नहीं रखता। यह YES / TRUE और NO / FALSE की तरह है।
ब्रेनन

1
@ ब्रेनन, यह पूरी तरह से सच नहीं है, सिर्फ इसलिए कि नील को परिभाषित किया गया है क्योंकि इसका मतलब यह नहीं है कि पर्दे के पीछे कुछ अन्य छिपा हुआ कार्यान्वयन है। उदाहरण के लिए, IBAction को शून्य के रूप में परिभाषित किया गया है, लेकिन इसका एक अलग अर्थ है जब इंटरफ़ेस बिल्डर का उपयोग करते समय बटन और इस तरह की क्रियाओं को संलग्न करने के तरीके प्रदर्शित करना।
मीकायाह वालेस

53

वे तकनीकी रूप से एक ही चीज़ हैं और केवल शैली में भिन्न हैं:

  • ऑब्जेक्टिव-सी स्टाइल कहती nilहै कि idटाइप (और पॉइंटर्स टू ऑब्जेक्ट्स) के लिए क्या उपयोग करना है ।
  • सी शैली का कहना NULLहै कि आप के लिए उपयोग क्या है void *
  • C ++ शैली आमतौर पर कहती है कि आपको बस उपयोग करना चाहिए 0

मैं आमतौर पर उस प्रकार का उपयोग करता हूं जो उस भाषा से मेल खाता है जहां प्रकार घोषित किया गया है


14

NULLहै C equivalentकी nil, कुछ भी करने के लिए एक सूचक;

कहाँ nil is zero typed as id,

NULL is zero typed as void*

एक महत्वपूर्ण बिंदु आप NULL को संदेश नहीं भेज सकते हैं। इसलिए कई स्थानों पर उद्देश्य-सी में नील का उपयोग करना पसंद किया जाता है।


4

वे लगभग एक ही चीज को छोड़कर,

nilएक उद्देश्य-सी शैली में प्रयोग किया जाता है। NULLC प्रकार के पॉइंटर्स के लिए कहां है और इसके लिए typdef'ed है (void *)


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