2010-05-22 14 views
6

मैं अक्सर वर्ग उदाहरण के तरीकों में इस तरह की एक कोड स्निपेट देखें:स्थिर NSStrings

static NSString *myString = @"This is a string."; 

मैं यह पता लगाने की क्यों इस काम करता है नहीं कर पा रहे। क्या यह बस # डीफिन के बराबर ओबीजेसी है जो विधि के दायरे तक ही सीमित है? मैं (सोचता हूं) मैं परिवर्तनीय की स्थिर प्रकृति को समझता हूं, लेकिन विशेष रूप से एनएसएसटींग्स ​​के बारे में, इसे आवंटित क्यों नहीं किया जा रहा है, init'd?

धन्यवाद ~

उत्तर

1

NSString alloc, init के भाग के लिए:

मैं पहली बार लगता है, यह एक सुविधा के रूप में सोचा जा सकता है, लेकिन यह भी उतना ही के लिए समान नहीं है [[NSString alloc] init] ।

मुझे यहां एक उपयोगी लिंक मिला। आप स्थिर और #define के भाग के लिए है कि NSString and shortcuts

पर एक नज़र ले जा सकते हैं:

कक्षा में स्थिर उदाहरण आप वर्ग के किसी भी मामले का उपयोग कर उपयोग कर सकती हैं। आप स्थिर के मूल्य को बदल सकते हैं। फ़ंक्शन के लिए, इसका मतलब है कि चर कॉल का मूल्य फ़ंक्शन कॉल

# परिभाषित करता है कि आप जादू संख्या और स्ट्रिंग से बचने और फ़ंक्शन मैक्रोज़ को परिभाषित करने के लिए मैक्रो स्थिरता डालते हैं। #define MAX_NUMBER 100. तो आप int [MAX_MUMBER] int का उपयोग कर सकते हैं। जब कोड संकलित किया जाता है, तो इसकी प्रतिलिपि बनाई जाएगी और इसे [100]

+0

मुझे यहां एक डाउनवोट क्यों मिला? – vodkhang

+1

यह मैं नहीं था, लेकिन मैं सहमत हूं - आपका जवाब बस समझ में नहीं आता है। मेरा जवाब देखें, यह मूल पोस्टर के प्रश्न को तीन अलग-अलग विषयों में अलग करता है (कैसे '@ "टेक्स्ट" शब्द का इलाज किया जाता है,' स्थिर 'कीवर्ड क्या करता है, और यह' # परिभाषित 'से अलग कैसे होता है) और स्पष्ट उत्तर देता है उम्मीद है कि लोग कुछ सीख सकते हैं। – harms

+0

आह, ठीक है। मुझे स्थिर के हिस्से की कमी थी। क्योंकि, पहली बार, मुझे केवल एनएसएसटींग आवंटन के बारे में पता है, इसलिए मैं केवल उस हिस्से का जवाब देता हूं। मैं अपना उत्तर – vodkhang

1

यह एनएसएसटींग के लिए एक विशेष मामला इनिट केस है जो बस एनएसएसटींग पॉइंटर को आवंटित आवंटित और आवंटित (या शायद आलसी, मुझे यकीन नहीं है।) इस कार्यक्रम में आपके द्वारा उपयोग किए जाने वाले प्रत्येक अद्वितीय "" के लिए इस एनएसएसटींग उदाहरणों में से एक है।

यह भी मुझे लगता है कि यह सत्य है, भले ही आप स्थिर कीवर्ड का उपयोग न करें। इसके अलावा मुझे लगता है कि इस स्ट्रिंग के साथ शुरू होने वाले सभी अन्य एनएसएसटींग्स ​​एक ही उदाहरण को इंगित करेंगे (समस्या नहीं है क्योंकि वे अपरिवर्तनीय हैं।)

यह # परिभाषा के समान नहीं है, क्योंकि आपके पास वास्तव में स्ट्रिंग बनाकर एक एनएसएसटींग चर है = @ "जो भी" प्रारंभिकरण के साथ। यह सी के const char* somestr = "blah blah blah" के बराबर लगता है।

9

मुझे लगता है कि प्रश्न में दो असंबंधित हिस्से हैं।

यही कारण है कि इसे आवंटित नहीं किया जा रहा है। जवाब यह है कि जब आप @"foo" फॉर्म का उद्देश्य-सी स्ट्रिंग अक्षर लिखते हैं, तो उद्देश्य-सी संकलक आपके लिए NSString उदाहरण बना देगा।

दूसरा सवाल यह है कि static संशोधक क्या करता है। यह वही करता है जो यह एक सी फ़ंक्शन में करता है, यह सुनिश्चित करता है कि myString वैरिएबल प्रत्येक बार विधि का उपयोग किया जाता है (विभिन्न ऑब्जेक्ट उदाहरणों के बीच भी)।

#define मैक्रो कुछ अलग है: यह कोड कोड के "प्रोग्रामेटिक कट और पेस्ट" है, कोड को संकलक पर आने से पहले निष्पादित किया गया है।

2

क्योंकि @"..." निर्माण (संकलक के माध्यम से) स्मृति में एक निरंतर स्ट्रिंग बनाता है आप alloc/init के लिए एक कॉल नहीं दिख रहा।

इस संदर्भ में, static का अर्थ है कि चर को उस फ़ाइल से बाहर नहीं किया जा सकता है जिसमें इसे परिभाषित किया गया है।

4

बस उसी static NSString घोषणा पर ठोकर खाई। मैंने सोचा कि यह स्थिर जादू कैसे काम करता है, इसलिए मैंने थोड़ा सा पढ़ा। मैं केवल आपके प्रश्न के स्थिर भाग को संबोधित कर रहा हूं। प्रकार (जैसे नाव) और भंडारण वर्ग (ऑटो, रजिस्टर, स्थिर, निर्वासन, typedef):

K&R के अनुसार सी में हर चर दो बुनियादी गुण होते हैं।

स्थिर भंडारण वर्ग दो अलग-अलग है कि क्या यह प्रयोग किया जाता है पर निर्भर करता है प्रभाव होते हैं:

    कोड (जैसे एक समारोह के अंदर) के एक ब्लॉक के अंदर
  • ,
  • सभी ब्लॉक के बाहर (कम से एक समारोह के रूप में एक ही स्तर)।

एक ब्लॉक के अंदर एक चर है कि यह भंडारण वर्ग घोषित नहीं है डिफ़ॉल्ट ऑटो माना कर रहा है (यानी यह स्थानीय है)। जैसे ही ब्लॉक निकलता है, यह हटा दिया जाएगा। जब आप स्थिर होने के लिए एक स्वचालित चर घोषित करते हैं तो यह बाहर निकलने पर इसका मूल्य रखेगा। कोड का ब्लॉक दोबारा शुरू होने पर वह मान तब भी होगा।

वैश्विक चर (एक समारोह के समान स्तर पर घोषित) हमेशा स्थिर होते हैं। स्पष्ट रूप से एक वैश्विक चर (या एक फ़ंक्शन) घोषित करने के लिए स्थिर केवल एक स्रोत कोड फ़ाइल के लिए अपने दायरे को सीमित करता है। यह से सुलभ नहीं होगा और यह अन्य स्रोत फ़ाइलों के साथ संघर्ष नहीं करेगा। इसे आंतरिक लिंक कहा जाता है।

यदि आप और अधिक जानना चाहते हैं तो internal and external linkage in C पर पढ़ें।