9

मैंने कुछ हफ्ते पहले उद्देश्य-सी सीखना शुरू कर दिया है और मुझे अभी भी समझ में नहीं आता कि कक्षा के encapsulation का प्रबंधन कैसे करें। कक्षा में एक निजी सदस्य चर घोषित करने का सबसे अच्छा तरीका क्या है?निजी सदस्य चर घोषित करना

ऐसा लगता है कि "@property" के साथ आपके सदस्य चर के लिए सही गेटर/सेटर सेट करना सही तरीका है, इसे इंटरफ़ेस में "@private" घोषित करने से कहीं अधिक है। लेकिन मुझे ऐसा लगता है कि यह अभी भी अन्य वर्गों को इन चरों तक पहुंच प्रदान करता है। यहां तक ​​कि यदि आप संपत्ति को "केवल पढ़ने" घोषित करते हैं, तो बाहरी कक्षा सदस्य चर के संदर्भ तक पहुंच सकती है और इसे संशोधित कर सकती है!

तो मैं एक निजी सदस्य चर घोषित करने का सबसे अच्छा तरीका अनुमान लगा रहा हूं कि किसी संपत्ति को घोषित न करके कोई गेटेटर/सेटर शामिल न हो। क्या मैं सही हू? या कोई बेहतर तरीका है?

धन्यवाद

उत्तर

23

यदि आप इसे अन्य वर्गों के लिए सुलभ नहीं करना चाहते, अपने क्रियान्वयन पर @property घोषित अपनी कक्षा के लिए एक गुमनाम श्रेणी बनाने।

हैडर फ़ाइल:

// MyClass.h 
@interface MyClass : NSObject { 
    NSObject *_privateObject; 
    NSObject *_readonlyObject; 
    NSObject *_publicObject; 
} 

@property (nonatomic, retain, readonly) NSObject *readonlyObject; 
@property (nonatomic, retain) NSObject *publicObject; 

@end 

कार्यान्वयन:

// MyClass.m 
@interface MyClass() 
    @property (nonatomic, retain) NSObject *privateObject; 
    // Make it writable on the implementation 
    @property (nonatomic, retain, readwrite) NSObject *readonlyObject; 
@end 

@implementation MyClass 

@synthesize privateObject = _privateObject; 
@synthesize readonlyObject = _readonlyObject; 
@synthesize publicObject = _publicObject; 

ये तीन अलग गुण के उदाहरण हैं।

  • निजी ऑब्जेक्ट अन्य कक्षाओं पर दिखाई नहीं दे रहा है;
  • readonlyObject दिखाई देता है लेकिन केवल पढ़ा जाता है;
  • publicObject दिखाई देता है और प्राप्त और सेट किया जा सकता है;
+0

ठीक है, तो एक श्रेणी का उपयोग करके मैं पूरी तरह से सदस्य चर को छुपा सकता हूं। लेकिन मुझे अभी भी एक दृश्यमान सदस्य के लिए "केवल पढ़ने" का उपयोग करने का मुद्दा नहीं मिला है, क्योंकि यह ऑब्जेक्ट का संदर्भ देता है। कोई संदर्भ को संशोधित कर सकता है और उस पर लिख सकता है, भले ही उसके पास कोई सेटटर न हो। –

+0

अच्छा बिंदु! मैं जांच करने की कोशिश करूंगा कि किस प्रकार का संरक्षण उद्देश्य-सी इसे देता है। मेरा अनुमान है कि जैसे ही आप अपने संदर्भित ऑब्जेक्ट के मान को बदलने का प्रयास करते हैं, यह एक प्रतिलिपि बनाता है और परिवर्तन सुरक्षित ऑब्जेक्ट पर प्रचार नहीं करते हैं। यहां यह प्रलेखन है: http://developer.apple.com/mac/library/documentation/cocoa/conceptual/objectivec/Articles/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW19 – vfn

+0

@ ओलिवर , क्या आप इसके लिए एक और सवाल तैयार करना चाहते हैं, और इस मुद्दे की बेहतर समझ देने के लिए अपना कोड वहां रखें। बीटीडब्ल्यू "अपरिचित चयनकर्ता" का अर्थ है कि आपके पास उस विशिष्ट चयनकर्ता नहीं है, जो एक संपत्ति या विधि हो सकता है। क्या आप वाकई "readwrite" विशेषाधिकारों के साथ संपत्ति घोषित कर चुके हैं? – vfn

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