2009-06-11 7 views
27

& आईफोन (उद्देश्य सी) में स्थिर स्ट्रिंग का उपयोग कैसे करें? मैं 0 एकक्षा एआईफोन पर उद्देश्य सी में स्टेटिक स्ट्रिंग वेरिएबल

घोषित करता हूं यदि मैं कक्षा बी में str = @"NewValue" के रूप में कुछ मान निर्दिष्ट करता हूं। यह मान कक्षा बी में सभी विधियों के लिए जारी रहता है लेकिन यदि मैं इसे कक्षा सी में एक्सेस करता हूं (बी में असाइनमेंट के बाद) मैं इसे OldValue के रूप में प्राप्त कर रहा हूं। क्या मुझे कुछ याद आ रही है? क्या मुझे अन्य कक्षाओं में बाहरी का उपयोग करना चाहिए?

धन्यवाद & सादर, योगिनी

उत्तर

44

अद्यतन: Xcode 8 के रूप में, ऑब्जेक्टिव-सी वर्ग गुण है। ध्यान दें, यह ज्यादातर वाक्य रचनात्मक चीनी है; ये गुण स्वत: संश्लेषित नहीं हैं, इसलिए कार्यान्वयन मूल रूप से पहले से अपरिवर्तित है।

// MyClass.h 
@interface MyClass : NSObject 
@property(class, copy) NSString* str; 
@end 

// MyClass.m 
#import "MyClass.h" 

@implementation MyClass 

static NSString* str; 

+ (NSString*) str 
{ 
    return str; 
} 

+ (void) setStr:(NSString*)newStr 
{ 
    if(str != newStr) { 
     str = [newStr copy]; 
    } 
} 
@end 


// Client code 
MyClass.str = @"Some String"; 
NSLog(@"%@", MyClass.str); // "Some String" 

WWDC 2016 What's New in LLVM देखें। कक्षा संपत्ति हिस्सा 5 मिनट के निशान से शुरू होता है।

मूल उत्तर:

ऑब्जेक्टिव-सी जो है मैं क्या लगता है कि आप के लिए देख रहे वर्ग चर नहीं है,। आप इसे स्थिर वैरिएबल के साथ नकली बना सकते हैं, जैसा कि आप कर रहे हैं।

मैं आपकी कक्षा की कार्यान्वयन फ़ाइल में स्थिर एनएसएसटींग डालने की सिफारिश करता हूं, और इसे एक्सेस/म्यूटेट करने के लिए कक्षा विधियां प्रदान करता हूं। कुछ इस तरह:

// MyClass.h 
@interface MyClass : NSObject { 
} 
+ (NSString*)str; 
+ (void)setStr:(NSString*)newStr; 
@end 

// MyClass.m 
#import "MyClass.h" 

static NSString* str; 

@implementation MyClass 

+ (NSString*)str { 
    return str; 
} 

+ (void)setStr:(NSString*)newStr { 
    if (str != newStr) { 
     [str release]; 
     str = [newStr copy]; 
    } 
} 
@end 
+0

बहुत बहुत धन्यवाद। इसे हल किया। – Yogini

29

जावा, जहां एक स्थिर चर एक वर्ग के सभी उदाहरणों के लिए स्कोप वाला विपरीत, सी में static मतलब यह है कि एक चर केवल फ़ाइल जहां यह घोषित किया जाता है के भीतर से पहुँचा जा सकता है। यह आपको फ़ंक्शन के अंदर एक स्थिर चर घोषित करने जैसी चीजों को करने की अनुमति देता है, जो like this के माध्यम से केवल पहली बार मान सेट करता है।

एक चीज जिसका आपने उल्लेख नहीं किया है वह कक्षा ए, बी, और सी के बीच संबंध है। यदि वे विरासत पदानुक्रम में हैं, और आप स्थिर चर को जावा में विरासत में प्राप्त करने की उम्मीद कर रहे हैं, तो विधि द्वारा वर्णित विधि zpasternack काम करेगा।

यदि तीन वर्ग असंबद्ध हैं, और आप केवल ए में घोषित मूल्य तक पहुंच बनाना चाहते हैं, तो extern जाने का एक और उचित तरीका है। इस मामले में, आप क्लासएएच में extern के रूप में चर घोषित करना चाहते हैं, फिर इसे कक्षा.एम में परिभाषित करें। जब तक कक्षा बी और कक्षासी कक्षा ClassA.h आयात करते हैं, वे एक ही बाहरी परिभाषा के खिलाफ लिंक करने में सक्षम होंगे।

एक बढ़िया बिंदु यह है कि, extern का उपयोग करने के बजाय, OBJC_EXPORT का उपयोग करने के लिए यह अधिक मजबूत है, जिसे objc-api.h में परिभाषित किया गया है और सी ++ के तहत संकलन को संभालता है।

// ClassA.h 
OBJC_EXPORT NSString* commonString; 
... 

// ClassA.m 
NSString* commonString = @"OldValue"; 

// ClassB.m 
#import "ClassA.h" 
... 
commonString = @"NewValue"; // Can be inside a function or method 
बेशक

, externed वैरिएबल का उपयोग इस तरह से एक कुख्यात बहुत बदनाम वैश्विक चर है, जो कि किसी को भी पढ़ने के लिए या लिख ​​सकते में कमजोर है बनाता है, और पहुँच अनियंत्रित है: यहाँ एक कोड नमूना है। यह सरल दृष्टिकोण है, और static बनाम extern का उपयोग करने के बारे में आपके प्रश्न का उत्तर देता है।हालांकि, एक डिजाइन सिद्धांत के रूप में, वर्ग विधियों के साथ चर को लपेटकर प्रदान किया गया encapsulation अधिक जटिल है, यद्यपि अधिक जटिल है। ऑब्जेक्ट उन्मुख भाषाओं में, जब आप जिस प्रभाव को प्राप्त करने का प्रयास कर रहे हैं वह क्लास-स्टेटिक विधि का है, तो encapsulation शायद जाने का सही तरीका है।

+0

बहुत बहुत धन्यवाद। इसे हल किया। – Yogini

+0

मुझे भी वही समस्या thnx लोगों का सामना करना पड़ा है .... – Sam97305421562

+0

जो मैं देख रहा था, धन्यवाद –

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