2009-07-06 14 views
66

इंटरफ़ेस के कार्यान्वयन में परिभाषित होने पर मैं स्थिर चर को समझ नहीं पा रहा हूं। तरीकों से मैं समझता हूं कि वे स्थानीय चर से अलग कैसे होते हैं, लेकिन जब कार्यान्वयन में सीधे परिभाषित नहीं किया जाता है।इंटरफ़ेस के कार्यान्वयन में स्थिर चर का अर्थ क्या है?

इन उदाहरणों को देखें। इन दोनों में व्यावहारिक रूप से क्या अंतर है?

#include "MyClass.h" 

@implementation MyClass 
int myInt; 
... 
@end 

और:

#include "MyClass.h" 

@implementation MyClass 
static int myInt; 
... 
@end 

myInt दोनों ही मामलों सभी तरीकों के लिए दिखाई दे रही है, और अगर मैं एक परीक्षण मैं सही ढंग से भाग गया व्याख्या की, myInt दोनों ही मामलों में अलग-अलग मामलों के लिए एक ही चर हो जाएगा कक्षा।

+0

देखें http://stackoverflow.com/a/4965145/654870 –

उत्तर

68

उस संदर्भ में 'स्थिर' कीवर्ड एक ही है, क्योंकि यह सादा सी में होगा: यह वर्तमान फ़ाइल को मींट के दायरे को सीमित करता है।

+12

इसके अलावा, @implementation अंदर एक गैर-स्थानीय चर को परिभाषित करने को परिभाषित करने से अलग नहीं है यह बाहर – sigjuice

+0

लेकिन क्या यह वास्तव में कार्यान्वयन फ़ाइलों में परिभाषाओं के लिए कोई फर्क पड़ता है?वे वैसे भी शामिल नहीं हैं। – quano

+8

मान लीजिए कि आपने int Varaleale घोषित किया है; दो अलग कार्यान्वयन फाइलों में। डुप्लिकेट प्रतीकों के कारण आपको बिल्ड समय पर त्रुटियां मिलेंगी। –

16

एप्पल के "ऑब्जेक्टिव-सी प्रोग्रामिंग भाषा" से: - बस वर्ग कि फ़ाइल में कार्यान्वित का हिस्सा करने के लिए इस प्रकार उदाहरण चर के विपरीत और ("एक चर स्थिर घोषणा इसके दायरे सिर्फ वर्ग के लिए सीमित करता है। , स्थैतिक चर को विरासत में प्राप्त नहीं किया जा सकता है, या उपनिवेशों द्वारा सीधे छेड़छाड़ नहीं किया जा सकता है)। "

80

दुर्भाग्यवश, इसका उपयोग इस पर निर्भर करता है कि आप इसका उपयोग कहां करते हैं।

स्टेटिक कार्य:
डिफ़ॉल्ट रूप से, सभी कार्यों को एक वैश्विक गुंजाइश है। स्थैतिक विनिर्देशक आपको फ़ंक्शन के दायरे को वर्तमान फ़ाइल तक सीमित करने देता है।

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

// main.m 
#import <Foundation/Foundation.h> 

int countByTwo() { 
    static int currentCount = 0; 
    currentCount += 2; 
    return currentCount; 
} 

int main(int argc, const char * argv[]) { 
    @autoreleasepool { 
     NSLog(@"%d", countByTwo()); // 2 
     NSLog(@"%d", countByTwo()); // 4 
     NSLog(@"%d", countByTwo()); // 6 
    } 
    return 0; 
} 

स्थिर कीवर्ड का यह उपयोग स्थानीय चर के दायरे को प्रभावित नहीं करता है।
static keyword के बारे में और पढ़ें।

+6

स्थैतिक कीवर्ड पूरी तरह से एप्लिकेशन रनटाइम के लिए केवल एक बार निष्पादित होने के लिए लागू होगा - आमंत्रण की संख्या के बावजूद! – Honey

+0

स्मृति में कहां स्थिर चर "currentCount" संग्रहीत है? यह गिनती में फ्रेम नहीं हो सकता है क्योंकि फ़ंक्शन समाप्त होने पर उस फ्रेम को हटा दिया जाता है। तो यह कहां संग्रहीत है? – Enrique

16

"दोनों सी और उद्देश्य-सी में, एक स्थिर चर एक चर है जो एक कार्यक्रम के पूरे जीवनकाल के लिए आवंटित किया जाता है। यह स्वचालित चर के विपरीत है, जिसका जीवनकाल एक समारोह कॉल के दौरान मौजूद होता है; और गतिशील रूप से- ऑब्जेक्ट्स जैसे आवंटित चर, जिन्हें अब उपयोग नहीं किया जा सकता है, स्मृति से रिलीज़ किया जा सकता है। अधिक सरलता से, एक स्थिर चर का मान सभी फ़ंक्शन/विधि कॉल में बनाए रखा जाता है। जब किसी फ़ंक्शन के बाहर घोषित किया जाता है, तो एक स्थिर चर फ़ाइल के भीतर सब कुछ के लिए दृश्यमान होता है जिसमें इसे घोषित किया जाता है; जब किसी फ़ंक्शन या विधि के अंदर घोषित किया जाता है, तो यह केवल उस फ़ंक्शन या विधि के भीतर दिखाई देता है, लेकिन मूल्य कॉल के बीच बनाए रखा जाता है। " बाहर पूर्ण विवरण यहाँ

की जांच:

https://stackoverflow.com/a/4965145/951349