दिलचस्प पोस्ट
JSP: जेएसटीएल का <c: out> टैग एसक्यूएल सर्वर मैनेजमेंट स्टूडियो और एसएक्सएक्ट एसक्यूएल में जीओ का क्या उपयोग है? आप दो आयामी सरणी कैसे घुमाएं? सेवा या धागे से एक पूर्वावलोकन के बिना कैमरा कैप्चर कैसे लेना है? कौन सी पात्रों को सी # वर्ग के नाम में अनुमति है? INOTifyPropertyChanged को कार्यान्वित करना – क्या एक बेहतर तरीका मौजूद है? मैं SIGSEGV (विभाजन त्रुटि) को कैसे पकड़ सकता हूं और एंड्रॉइड पर जेएनआई के तहत एक स्टैक ट्रेस प्राप्त कर सकता हूं? गतिशील JComboBoxes पायथन में "कुछ नहीं" पर stdout पुनर्निर्देशित करना एंड्रॉइड स्टूडियो के भीतर लॉगकैट विंडो को पुनर्स्थापित करें सी # में पार्स जेसन स्ट्रिंग बाइनरी को राज्य के साथ समीक्षा के लिए प्रतीक्षा कर रहा है (बाइनरी बटन अस्वीकार नहीं किया जा सकता है) एंड्रॉइड में asynctask थ्रेड कैसे रोकें? मैं कैसे जांचूं अगर कोई स्ट्रिंग में कोई विशिष्ट शब्द होता है? विधि पैरामीटर और स्थानीय चर के लिए अंतिम उपयोग करना चाहिए?

कैसे एक असली निजी आवृत्ति चर बनाने के लिए?

मैं एक आवृत्ति चर बनाना चाहता हूं जो बाहर से एक्सेस नहीं की जा सकती उद्देश्य-सी में ऐसा कुछ ऐसा संभव है? मुझे याद है कि ऐप्पल के पास निजी वैरिएबल और सामान हैं, लेकिन अगर लोगों को उनके बारे में पता है, तो वे उनका इस्तेमाल कर सकते हैं। ऐप्पल कहता है कि "निजी एपीआई", लेकिन जाहिर है कि अन्य लोग उस सामान का उपयोग कर सकते हैं यदि उन्हें पता है कि वहां क्या है।

अब तक मुझे विश्वास है कि ऐसा कुछ एक निजी उदाहरण चर बनाता है:

@interface MyClass : NSObject { CGFloat weight; } 

कोई @प्रॉपर्टी नहीं, संसंश्लेषण नहीं, केवल ऊपर की घोषणा।

मुझे यह भी पता है कि एपल एक _inFrontOfTheirPrivateInstanceVariables को जोड़ता है, लेकिन उन्होंने कहा कि कहीं वे दूसरों को ऐसा करने को नहीं दिखाना चाहते हैं क्योंकि वे ऐसा करते समय गलती से छिपे हुए उदाहरण चर को ओवरराइड कर सकते हैं

यहां चाल क्या है?

वेब के समाधान से एकत्रित समाधान "कैसे एक असली निजी आवृत्ति चर बनाने के लिए?"

आप बाद में सभी वैरिएबल घोषणाओं को निजी बनाने के लिए {} अंदर @private कीवर्ड का उपयोग कर सकते हैं। डिफ़ॉल्ट दृश्यता @protected protected है (जो जावा में protected है) और वह आम तौर पर अच्छी तरह से काम करता है। आपको विशिष्ट रूप से एक वैरिएबल को @public रूप से घोषित करना होगा, जिसके लिए यह कक्षा के बाहर सीधे पहुंच योग्य हो।

यह ऐप्पल दस्तावेज़ीकरण में परिवर्तनशील गुंजाइश और दृश्यता के बारे में अधिक जानकारी है।

"निजी एपीआई" और निजी चर के बीच अंतर भी है उद्देश्य-सी में, आप तरीकों को निजी नहीं बना सकते हैं – कोई भी कोई भी विधि कॉल कर सकता है। "गुप्त" तरीकों को बनाने के कई तरीके हैं, लेकिन यह इस प्रश्न के दायरे से कुछ हद तक है यहां कुछ संबंधित SO प्रश्न दिए गए हैं:

  • उद्देश्य-सी में निजी उदाहरण चर के बारे में
  • उद्देश्य- C में "@ निजी" का क्या अर्थ है?
  • क्या उद्देश्य-सी में निजी रूप से एक विधि घोषित करना संभव है?
  • उद्देश्य-सी में एक वर्ग के लिए निजी तरीकों को परिभाषित करने का सर्वोत्तम तरीका

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

@private 4 और बाद में उपलब्ध नए एलएलवीएम कम्पाइलर के साथ, आप अपने कार्यान्वयन (। एम) फ़ाइल के भीतर डिफ़ॉल्ट श्रेणियों में @private चर की घोषणा कर सकते हैं:

 @interface ClassName() { @private // private variables here } @end @implementation ClassName // you can use private variables here @end 

मुझे यह सुविधाजनक लगता है, क्योंकि मुझे प्रदूषण से नफरत है, निजी चर मेरे हेडर फाइलों में आते हैं।

आप केवल उन्हीं को @ कार्यान्वयन में रखते हुए निजी तरीकों को परिभाषित कर सकते हैं, न कि @ अंतरफलक

इसी तरह, @ प्रामाणिकता की शुरुआत में आप एक गुमनाम ब्लॉक के अंदर निजी इंस्टेंस चर को परिभाषित कर सकते हैं – जैसा कि आप @ इंटेटर के अंदर सार्वजनिक इवार के लिए करते हैं

निम्नलिखित उदाहरण देखें

 @interface EXClass : NSObject { uint8_t publicInteger; float publicFloat; } -(void)publicMethod; @end @implementation EXClass { uint8_t privateInteger; float privatefloat; } -(BOOL)privateMethod { return FALSE; } 

याद रखें कि उद्देश्य-सी पद्धतियों को रनटाइम पर संदेश के रूप में भेजा जाता है, हालांकि (C ++ के संकलन समय बाध्यकारी के बजाय), तो प्रतिक्रिया देता है: टाऊसेलेटर: अभी भी सच हो जाएगा और चयनकर्ता: अभी भी विधि को कॉल करेगा आईवर पूरी तरह निजी होगा।

यदि आप एक पुस्तकालय बना रहे थे, हालांकि, सैद्धांतिक रूप से कोई भी उन तरीकों के बारे में नहीं पता होगा जिन्हें आपने शीर्ष लेख फाइलों में नहीं घोषित किया है।

उद्देश्य-सी में सभी iVars डिफ़ॉल्ट रूप से सुरक्षित हैं यदि आप अन्य वर्गों की तुलना में एक्सेसर तरीके नहीं लिखते हैं, तो वे चर को देखने में सक्षम नहीं होंगे।

दो अपवाद श्रेणियां और उप-वर्ग हैं

इंस्टेंस वैल्यू नामकरण के लिए एप्पल डॉक्स स्पष्ट तरीके से चेतावनी नहीं देता है कि इनवेस्टमेंट वेरिएबल्स के नाम से अंडरस्कोर का प्रयोग किया जाता है जैसे निजी विधि दस्तावेज।

नामकरण इंस्टेंस व्हेरिएबल और डेटा प्रकार

मुझे यह भी याद है कि Wil Shipley और कुछ अन्य ओएस एक्स डेवलपर्स के बीच एक वार्तालाप को रेखांकित करता है। जिस तरह से ओब-सी कंपाइलर काम करता है, अगर ऐप्पल अपने चौखटे में एक वर्ग के लिए एक नए इंस्टेंस वैरिएबल को जोड़ना चाहते हैं, तो यह उन चौखटे का उपयोग करके सभी ऐप को पुनः कंपाइल करने की आवश्यकता होगी। जहां तक ​​पहले से मौजूद इंस्टेंस वैरिएबल, जब आप एक पर कदम रखते हैं तो आपको एक चेतावनी मिलनी चाहिए।

मैंने एप्पल द्वारा एक नमूना ऐप (पेंटजीएल) में निम्न उपयोग देखा था

फ़ाइल में

 @interface MyClass (private) - (void) privateMethod(); @property(...) myProperty; @end 

अस्वीकरण: नमूना एप्लिकेशन में केवल विधि घोषणाएं हैं, मैंने इस SO धागे में निजी संपत्ति घोषणा देखा है

आप एक असली निजी उदाहरण चर नहीं बना सकते उद्देश्य-सी एक गतिशील भाषा है और इसलिए किसी भी वैरिएबल (यहां तक ​​कि @ प्राइवेट) तक पहुंचना संभव है।

मेरा सबसे अच्छा तरीका:

इसे आप के कार्यान्वयन ब्लॉक में उपयोग करें। एम फ़ाइल फिर यह दिखाई नहीं दे रहा है और केवीसी को ब्लॉक नहीं करता, जिससे कि केवीसी काम न करे

 @implementation ClassName { // default to @protected // but the subclasses can't see ivars created in the implementation block float number; } + (BOOL)accessInstanceVariablesDirectly { return NO; // no KVC } @end