2010-03-19 6 views
5

कुछ विधियों में तर्क सूची nil के साथ क्यों समाप्त होती है? मैं विशेष रूप से संग्रह की कक्षाओं में इस पर ध्यान दिया है उदाहरण के लिए NSSet,:कुछ कोको विधियों में तर्क सूची क्यों शून्य से समाप्त होती है?

mySet = [NSSet setWithObjects:someData, aValue, aString, nil]; 

और NSArray:

NSArray *objects = [NSArray arrayWithObjects:@"value1", @"value2", @"value3", nil]; 

उत्तर

13

यह कैसे चर तर्क सूचियों काम (va_list, मानकों में ... के रूप में देखा के साथ क्या करना है)। जब कोड सूची में सभी मान निकालने का प्रयास कर रहा है, तो उसे यह जानना होगा कि कब रुकना है (क्योंकि यह नहीं जानता कि कितने हैं)। हम सूची के अंत को "सेंटीनेल" नामक विशेष मूल्य के साथ दर्शाते हैं, जो आमतौर पर NULL होता है। इस तरह, जब प्रसंस्करण कोड में nil पर आता है, तो यह जानता है कि यह अंत तक पहुंच गया है। यदि आप nil छोड़ देते हैं, तो आपको अजीब त्रुटियां मिलेंगी, क्योंकि कोड केवल स्टैक को पढ़ना जारी रखेगा, चीजों को वस्तुओं के रूप में व्याख्या करेगा, जब तक कि इसे nil न मिले।

यह बहुत ही समान है कि क्यों सी तारों को NULL होना चाहिए।

एक तरफ ध्यान दें के रूप में, stringWithFormat: और इसी तरह के printf शैली के तरीकों, एक प्रहरी की जरूरत नहीं है क्योंकि यह पता लगा लेता है कि कितने मापदंडों कितने % संशोधक प्रारूप स्ट्रिंग में हैं के आधार पर की जरूरत है। इसलिए यदि आप @"hello, %@" की प्रारूप स्ट्रिंग देते हैं, तो यह केवल एक अतिरिक्त तर्क की तलाश करेगा, क्योंकि केवल एक% संशोधक है।

+6

+1, लेकिन मुझे अभी भी लगता है कि एक असीसी-कला बीएसजी सिलोन भेजे गए – slf

3

उद्देश्य-सी में वैरैडिक फ़ंक्शन nil तर्क प्रदान करने के अलावा, आपकी तर्क सूची समाप्त होने पर निर्धारित करने का कोई तरीका नहीं है।

+1

या प्रारूप स्ट्रिंग के लिए एनयूएलएल की तुलना में कूलर होगा। (सी में समान) –

+1

या एक स्पष्ट तर्क गणना। –

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