उद्देश्य-सी में @private
का क्या अर्थ है?उद्देश्य-सी में "@private" का क्या अर्थ है?
उत्तर
यह एक दृश्यता संशोधक का मतलब है-यह कि उदाहरण चर घोषित रूप @private
केवल एक ही कक्षा की उदाहरणों द्वारा पहुँचा जा सकता है। निजी सदस्यों को उप-वर्गों या अन्य वर्गों द्वारा उपयोग नहीं किया जा सकता है।
उदाहरण के लिए:
@interface MyClass : NSObject
{
@private
int someVar; // Can only be accessed by instances of MyClass
@public
int aPublicVar; // Can be accessed by any object
}
@end
इसके अलावा, स्पष्ट करने के लिए, विधियों हमेशा ऑब्जेक्टिव-सी में सार्वजनिक कर रहे हैं। अधिक जानकारी के लिए "छिपाने" विधि घोषणाओं के तरीके हैं, हालांकि this question देखें।
@ कार्यान्वयन के बाद ब्रेसिज़ में मौजूद आवृत्ति चर के बारे में क्या? क्या वे हमेशा निजी हैं? –
मुझे पता है कि यह पुराना है ... लेकिन यह एक दृश्यता संशोधक नहीं है। यह एक एक्सेस संशोधक है। यह सी ++ में एक और महत्वपूर्ण भेद है, लेकिन यह उद्देश्य-सी में भी एक भेद है। परिवर्तक संकलक के लिए दृश्यमान है। कंपाइलर बस आपको इसका उपयोग नहीं करने देता है। – gnasher729
जैसा कि एचटीवी ने कहा, यह एक दृश्यता संशोधक है। @private
का अर्थ है कि ivar (instance variable) केवल उसी कक्षा के उदाहरण के भीतर से ही पहुंचा जा सकता है। हालांकि, इसका मतलब आपके लिए बहुत अधिक नहीं हो सकता है, इसलिए मैं आपको एक उदाहरण देता हूं। सादगी के लिए हम उदाहरण के रूप में कक्षाओं के init
विधियों का उपयोग करेंगे। मैं ब्याज की वस्तुओं को इंगित करने के लिए इनलाइन टिप्पणी करूंगा।
@interface MyFirstClass : NSObject
{
@public
int publicNumber;
@protected // Protected is the default
char protectedLetter;
@private
BOOL privateBool;
}
@end
@implementation MyFirstClass
- (id)init {
if (self = [super init]) {
publicNumber = 3;
protectedLetter = 'Q';
privateBool = NO;
}
return self;
}
@end
@interface MySecondClass : MyFirstClass // Note the inheritance
{
@private
double secondClassCitizen;
}
@end
@implementation MySecondClass
- (id)init {
if (self = [super init]) {
// We can access publicNumber because it's public;
// ANYONE can access it.
publicNumber = 5;
// We can access protectedLetter because it's protected
// and it is declared by a superclass; @protected variables
// are available to subclasses.
protectedLetter = 'z';
// We can't access privateBool because it's private;
// only methods of the class that declared privateBool
// can use it
privateBool = NO; // COMPILER ERROR HERE
// We can access secondClassCitizen directly because we
// declared it; even though it's private, we can get it.
secondClassCitizen = 5.2;
}
return self;
}
@interface SomeOtherClass : NSObject
{
MySecondClass *other;
}
@end
@implementation SomeOtherClass
- (id)init {
if (self = [super init]) {
other = [[MySecondClass alloc] init];
// Neither MyFirstClass nor MySecondClass provided any
// accessor methods, so if we're going to access any ivars
// we'll have to do it directly, like this:
other->publicNumber = 42;
// If we try to use direct access on any other ivars,
// the compiler won't let us
other->protectedLetter = 'M'; // COMPILER ERROR HERE
other->privateBool = YES; // COMPILER ERROR HERE
other->secondClassCitizen = 1.2; // COMPILER ERROR HERE
}
return self;
}
तो अपने सवाल का जवाब देने, @private किसी अन्य वर्ग का एक उदाहरण के द्वारा पहुँच से ivars सुरक्षा करता है। ध्यान दें कि MyFirstClass के दो उदाहरण सीधे एक-दूसरे के इवर्स तक पहुंच सकते हैं; यह माना जाता है कि चूंकि प्रोग्रामर के पास इस वर्ग पर सीधे नियंत्रण होता है, इसलिए वह बुद्धिमानी से इस क्षमता का उपयोग करेगा।
यह उल्लेख किया जाना चाहिए कि उद्देश्य-सी में @public, @proteced और @private का उपयोग करना असामान्य है। पसंदीदा दृष्टिकोण हमेशा एक्सेसर्स का उपयोग करना है। –
बीजे, मैंने देखा है कि इस प्रश्न के लिए यह सबसे संक्षिप्त और सहायक प्रतिक्रिया है। बहुत अच्छी तरह से डाल दिया। – MikeyWard
@ जॉर्ज, लेकिन आप एक्सेसर्स के उपयोग को तब तक कैसे लागू करते हैं जब तक कि आप अपने इवर को प्रतिबंधित दृश्यता के साथ चिह्नित न करें? –
यह समझना महत्वपूर्ण है कि इसका मतलब क्या है जब कोई कहता है कि आप @private
इंस्टेंस चर का उपयोग नहीं कर सकते हैं। वास्तविक कहानी यह है कि यदि आप अपने स्रोत कोड में इन चरों तक पहुंचने का प्रयास करते हैं तो संकलक आपको एक त्रुटि देगा। जीसीसी और एक्सकोड के पिछले संस्करणों में, आपको बस एक त्रुटि के बजाय चेतावनी मिलेगी।
किसी भी तरह से, रन टाइम पर, सभी दांव बंद हैं। ये @private
और @protected
इवर किसी भी वर्ग के किसी ऑब्जेक्ट द्वारा पहुंचा जा सकता है। ये दृश्यता संशोधक सिर्फ स्रोत कोड को मशीन कोड में संकलित करना मुश्किल बनाते हैं जो दृश्यता संशोधक के इरादे का उल्लंघन करता है।
सुरक्षा के लिए ivar दृश्यता संशोधक पर भरोसा न करें! वे बिल्कुल भी नहीं प्रदान करते हैं। वे वर्ग-निर्माता की इच्छाओं के संकलन-समय प्रवर्तन के लिए सख्ती से हैं।
इस सवाल पर पॉडकास्ट # 53 में चर्चा की गई थी! (https://stackoverflow.blog/2009/05/14/podcast-53/) – DaveInCaz