2009-10-05 15 views
6

यदि मेरे पास कुछ आईबीओटलेट्स के साथ कक्षा है, तो इनके लिए एक्सेसर्स बनाने के लिए यह मूर्खतापूर्ण लगता है।क्या मुझे हमेशा उद्देश्य-सी में आवृत्ति चर के लिए एक्सेसर्स का उपयोग करना चाहिए?

लेकिन फिर मुझे लगता है कि मैं ओओ प्रथाओं को तोड़ रहा हूं, उदाहरण के लिए हमेशा एक्सेसर्स के माध्यम से नहीं जा रहा हूं।

मैं कुछ उदाहरण चर के बारे में भी वैसे ही महसूस करता हूं जो सार्वजनिक नहीं होना चाहिए, मैं कुछ वर्गों के आंतरिक कार्यों का पर्दाफाश नहीं करना चाहता हूं। मैं वास्तविक ivars निजी बना सकता हूं लेकिन @property shorthand दृश्यता निर्दिष्ट करने में सक्षम नहीं प्रतीत होता है। इससे मुझे एक्सेसर्स नहीं बनाया जाता है और सीधे इवर तक पहुंच होती है। मुझे यकीन नहीं है कि यह हालांकि पर फंस गया है। क्या यह?

इस स्वीकार्य नौसिखिया प्रश्न पर समुदाय के विचार क्या हैं? (कृपया डॉट सिंटैक्स को अनदेखा करें)

उत्तर

4

मुझे इंस्टेंस वैरिएबल तक सीधे पहुंचने के बारे में निश्चित नहीं है, मुझे लगता है कि किसी को नहीं करना चाहिए, लेकिन कुछ चर के लिए यह एक्सेसर्स का उपयोग करने के लिए समझ में नहीं आता है। आपने उल्लेख किया है कि IBOutlet के लिए पसंद है।

मैं केवल निजी एक्सेसर्स के साथ आपकी सहायता कर सकता हूं। उद्देश्य-सी 2.0 से शुरू करना आप declare extensions कर सकते हैं।

कक्षा एक्सटेंशन को छोड़कर कि तरीकों वे घोषित इसी वर्ग के लिए मुख्य @implementation ब्लॉक में लागू किया जाना चाहिए, "गुमनाम" श्रेणियों की तरह हैं।

बस इस एक्सटेंशन को एक अलग हेडर फ़ाइल में डालें और आपके पास निजी एक्सेसर्स होंगे जो शीर्षलेख में दिखाई नहीं दे रहे हैं।

3

सार्वजनिक/निजी

आप केवल पढ़ने के लिए होने के लिए @interface फ़ाइल में के रूप में अपने Ivars घोषणा कर सकते हैं, लेकिन फिर उन्हें एक वर्ग में फिर से घोषित ताकि आपके वर्ग उन्हें बदल सकते हैं। यहां एक quick intro to Categories है।

एक उदाहरण:

//MyClass.h 

@interface MyClass : NSObject { 
    NSString *name; 
} 
@property (readonly) NSString *name; 

@end 

और कार्यान्वयन फ़ाइल में आप इस redeclare कर सकते हैं:

//MyClass.m 
@interface MyClass() //declare the class extension 

@property (readwrite, copy) NSString *name; //redeclare the property 

@end 

@implementation MyClass 

@synthesize name; 

@end 

अब, name संपत्ति वर्ग के लिए केवल पढ़ने के लिए बाहरी है, लेकिन वर्ग द्वारा बदला जा सकता संपत्ति वाक्यविन्यास या सेटर/गेटर वाक्यविन्यास के माध्यम से।

सच निजी Ivars

आप Ivars वास्तव में निजी रखने के लिए और केवल @property वाक्य रचना के माध्यम से जा के बिना सीधे उन तक पहुँचने आप @private कीवर्ड के साथ उन्हें घोषणा कर सकते हैं चाहते हैं। लेकिन फिर आप कहते हैं "आह, लेकिन वे हमेशा setValueForKey: जैसे केवीसी विधियों का उपयोग कर कक्षा के बाहर मूल्य प्राप्त कर सकते हैं" इस मामले में NSKeyValueCoding प्रोटोकॉल क्लास विधि + (BOOL)accessInstanceVariablesDirectly पर एक नज़र डालें जो इसे रोकता है। गुण

रूप

IBOutlets recommended रास्ता @property और @synthesize उपयोग करने के लिए है।मैक ओएस एक्स के लिए, आप उन्हें केवल पढ़ने योग्य गुणों के रूप में घोषित कर सकते हैं। उदाहरण के लिए:

//MyClass.h 

@interface MyClass : NSObject { 
    NSView *myView; 
} 
@property (readonly) IBOutlet NSView *myView; 

@end 

//MyClass.m 

@implementation MyClass 

@synthesize myView; 

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