2013-02-20 43 views
7

में पॉइंटर्स का उपयोग करने का सबसे बड़ा फायदा क्या है मुझे पता है कि 99% आप सोचते हैं कि "क्या एच *** ..." लेकिन कृपया मुझे pointers का उपयोग करने की इस अवधारणा के आसपास अपना सिर लेने में मदद करें। मुझे यकीन है कि मेरा विशिष्ट प्रश्न बहुत सारे नए लोगों की मदद करेगा।ऑब्जेक्टिव

मैं समझता हूं कि कौन से पॉइंटर्स हैं और वे स्मृति में एक एड्रेस का संदर्भ हैं और (*) ऑपरेटर का उपयोग करके आप उस पते में मूल्य प्राप्त कर सकते हैं।

मान लीजिए:

int counter = 10; 
int *somePointer = &counter; 

अब मैं counter की स्मृति में पता है, और मुझे परोक्ष रूप से ऐसा करने से अपने मूल्य को इंगित कर सकते हैं:

int x = *somePointer; 

कौन सा x = 10 बनाता है, है ना?

लेकिन यह सबसे बुनियादी उदाहरण है, और इस मामले के लिए मैं int x = counter; का उपयोग कर सकता हूं और वह मान प्राप्त कर सकता हूं, इसलिए कृपया बताएं कि पॉइंटर्स वास्तव में उद्देश्य-सी और कुछ अन्य भाषाओं में क्यों एक महत्वपूर्ण बात है ... किस मामले में केवल एक सूचक समझ में आता है?

इसकी सराहना करें।

+3

एक सूचक एक पते का संदर्भ नहीं है। आप कह सकते हैं कि एक सूचक स्मृति की संदर्भ है, या यह एक चर के संदर्भ है, लेकिन यह * एक पता है। (तकनीकी रूप से, एक सूचक एक चर है, और इसका मान एक पता है। अंग्रेजी संदिग्ध है।) –

+4

कोई वस्तु को आवंटित रूप से आवंटित नहीं करता है। – CodaFi

+0

आप वहां से शुरू करना चाहेंगे: http://stackoverflow.com/questions/5203284/objective-c-and-pointers/5203296#5203296 –

उत्तर

2

ObjectiveC में संकेत का उपयोग कर

मैं कहना चाहता हूँ सबसे बड़ा लाभ यह है कि आप सब पर ObjectiveC का उपयोग कर सकते है की सबसे बड़ी विशेषता क्या है - सब ObjectiveC वस्तुओं संकेत हैं पॉइंटर्स का उपयोग करके एक्सेस किया गया (कंपाइलर और रनटाइम आपको ऑब्जेक्ट्स को स्थिर रूप से बनाने नहीं देगा), इसलिए आप उनके बिना आगे नहीं पाएंगे ...

+0

धन्यवाद आवंटित @ एच 2CO3 – NickCave

5

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

अधिक महत्वपूर्ण बात यह है कि पॉइंटर्स इसे अधिक एक दूसरे से बात करने के लिए अपने कोड के विभिन्न हिस्सों के लिए आसान बनाते हैं। यदि चर केवल "संदर्भ द्वारा" के बजाय "मूल्य से" कार्यों में पारित किए जा सकते हैं (जो पॉइंटर्स का उपयोग करते समय होता है), तो फ़ंक्शंस कभी भी उनके इनपुट को बदल नहीं सकता है। वे या तो एक मूल्य लौटकर या वैश्विक वैरिएबल को बदलकर अपने प्रोग्राम की स्थिति को बदल सकते हैं-जिसका अत्यधिक उपयोग आम तौर पर मैला, असंगठित कोड की ओर जाता है।

यहां एक ठोस उदाहरण है। मान लीजिए आप एक ऑब्जेक्टिव-सी विधि है कि JSON स्ट्रिंग को पार्स करने और वापस आ जाएगी है एक NSDictionary:

+ (NSDictionary *)parseJsonString:(NSString *)json 
          error:(NSError **)error; 

विधि पार्स करते हैं और एक NSDictionary लौट सब कुछ ठीक हो जाता है जाएगा। लेकिन इनपुट स्ट्रिंग के साथ कुछ समस्या होने पर क्या होगा? हम उपयोगकर्ता (या कम से कम प्रोग्रामर को) को इंगित करने का एक तरीका चाहते हैं, तो हमारे पास NSError पर पॉइंटर के लिए सूचक है, जिसमें वह जानकारी होगी।यदि हमारी विधि विफल हो जाती है (शायद nil लौट रही है), तो हम क्या गलत होने के लिए error पैरामीटर को अस्वीकार कर सकते हैं। हमने प्रभावी ढंग से क्या किया है हमारी विधि को दो अलग-अलग प्रकार के रिटर्न मान देना है: आमतौर पर, यह NSDictionary लौटाएगा, लेकिन यह NSError भी वापस कर सकता है।

यदि आप इसके बारे में और अधिक पढ़ना चाहते हैं, तो आपको "उद्देश्य-सी" में पॉइंटर्स की बजाय "पॉइंटर्स इन सी" की खोज में बेहतर भाग्य हो सकता है; पॉइंटर्स का उद्देश्य उद्देश्य-सी में व्यापक रूप से उपयोग किया जाता है, लेकिन सभी अंतर्निहित मशीनरी सी के समान होती है।

+2

अंतर्निहित तंत्र केवल सी के समान नहीं है, यह * है * सी – CodaFi

+0

@ कोडाफ़ी आप इस रात शानदार हो रहे हैं, हमेशा के रूप में: डी –

+0

@ कोडाफ़ी हां, अच्छी तरह से कहा। – bdesham

1

मद:

क्या होगा यदि मैं तुमसे कहा था मुझे एक प्रोग्राम है जो काउंटर का एक सेट बनाए रखना होगा लिखने के लिए, लेकिन काउंटर की संख्या उपयोगकर्ता द्वारा दर्ज किया जाएगा, जब वह कार्यक्रम शुरू कर दिया। हम इसे ढेर पर आवंटित पूर्णांक की सरणी के साथ कोड करते हैं।

int *counters = malloc(numOfCounters * sizeof(int)); 

मॉलोक मेमोरी के साथ सीधे काम करता है, इसलिए यह प्रकृति द्वारा एक सूचक लौटाता है। सभी उद्देश्य-सी वस्तुओं को ढेर-malloc के साथ आवंटित किया जाता है, इसलिए ये हमेशा पॉइंटर्स होते हैं।

मद:

क्या होगा यदि मैं तुमसे कहा था मुझे एक समारोह है कि एक फ़ाइल को पढ़ने, और फिर एक और समारोह भाग गया जब यह किया गया था लिखने के लिए। हालांकि, यह अन्य कार्य अज्ञात था और अन्य लोगों द्वारा जोड़ा जाएगा, जिन लोगों को मैं भी नहीं जानता था।

इसके लिए हमारे पास "कॉलबैक" है। आप एक ऐसा फ़ंक्शन लिखेंगे जो इस तरह दिखता है:

int ReadAndCallBack(FILE *fileToRead, int numBytes, int whence, void(*callback)(char *)); 

वह अंतिम तर्क किसी फ़ंक्शन के लिए सूचक है। जब कोई समारोह आपके द्वारा लिखी गई कहता है, वे कुछ इस तरह करते हैं:

void MyDataFunction(char *dataToProcess); 

ReadAndCallBack(myFile, 1024, 0, MyDataFunction); 

मद:

एक समारोह तर्क के रूप में एक सूचक पासिंग एक समारोह से एक से अधिक मान लौटने का सबसे आम तरीका है । ओएसएक्स पर कार्बन पुस्तकालयों में, लगभग सभी लाइब्रेरी फ़ंक्शन एक त्रुटि स्थिति लौटाते हैं, जो किसी लाइब्रेरी फ़ंक्शन को प्रोग्रामर के लिए कुछ उपयोगी लौटने पर समस्या उत्पन्न होती है। तो तुम, पता है जहाँ आप हाथ जानकारी के लिए समारोह वापस आप करना चाहते हैं ...

int size = 0; 
int error = GetFileSize(afilePath,&size); 

समारोह कॉल एक त्रुटि देता है पारित यह error में है, अगर कोई त्रुटि हुई थी, error शायद होगा शून्य हो और size में हमें जो चाहिए वह शामिल होगा।

+0

अगर मैंने आपको बताया कि ओबीजेसी में इस जवाब का एक चाटना नहीं था? (निश्चित रूप से ढेर आवंटन को बचाएं) – CodaFi

+0

मैं स्वीकार करता हूं कि मैंने उद्देश्य-सी के साथ अपने पहले कुछ महीनों में पॉइंटर्स को वास्तव में कभी नहीं समझा, और मुझे अवधारणा को वास्तव में समझने के लिए सादा सी सीखना पड़ा। – iluvcapra

-1

उद्देश्य-सी में पॉइंटर्स का सबसे बड़ा लाभ, या गतिशील आवंटन वाली किसी भी भाषा में, यह है कि आपका प्रोग्राम आपके स्रोत कोड में आपके द्वारा आविष्कार किए गए नामों से अधिक आइटम संभाल सकता है।

+0

क्षमा करें, लेकिन यह ज्यादा समझ में नहीं आता है। पॉइंटर परिवर्तनीय नामों को कैसे प्रभावित करता है? क्या आप कुछ एरे के साथ पॉइंटर को कैसे मिलाते हैं? – vikingosegundo