@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
इसके अलावा, स्पष्ट करने के लिए, विधियां हमेशा उद्देश्य-सी में सार्वजनिक होती हैं। "छिपाने" की विधि घोषणाओं के तरीके हैं, हालांकि - अधिक जानकारी के लिए इस प्रश्न को देखें।
जैसा कि htw ने कहा, यह एक दृश्यता संशोधक है। @private
इसका मतलब है कि ivar (उदाहरण चर) केवल उसी वर्ग के उदाहरण से सीधे पहुँचा जा सकता है। हालाँकि, यह आपके लिए ज्यादा मायने नहीं रखता है, इसलिए मैं आपको एक उदाहरण देता हूं। हम 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;
}
तो आपके प्रश्न का उत्तर देने के लिए, @ सहायता किसी अन्य वर्ग के उदाहरण द्वारा आइवर को एक्सेस से बचाता है। ध्यान दें कि MyFirstClass के दो उदाहरण सीधे एक-दूसरे के सभी आइवर तक पहुंच सकते हैं; यह माना जाता है कि चूंकि प्रोग्रामर का सीधे इस वर्ग पर पूरा नियंत्रण है, इसलिए वह इस क्षमता का बुद्धिमानी से उपयोग करेगा।
@private
किसी ऑब्जेक्ट के लिए टेम्प्लेट में डालता है, इसलिए यह अब तक असामान्य नहीं है।
@implementation
ब्लॉक पर रखा जा सकता है । और एक बार जब आप ऐसा करते हैं, तो वे दृश्यता संशोधक के लिए प्रभावी रूप से निजी नहीं होते हैं, क्योंकि वे उस फ़ाइल के बाहर किसी को भी दिखाई नहीं देते हैं।
यह समझना महत्वपूर्ण है कि इसका क्या मतलब है जब कोई कहता है कि आप एक @private
उदाहरण चर का उपयोग नहीं कर सकते हैं । असली कहानी यह है कि कंपाइलर आपको एक त्रुटि देगा यदि आप अपने स्रोत कोड में इन चरों को एक्सेस करने का प्रयास करते हैं। GCC और XCode के पिछले संस्करणों में, आपको केवल एक त्रुटि के बजाय एक चेतावनी मिलेगी।
किसी भी तरह, रन टाइम पर, सभी दांव बंद हो जाते हैं। ये @private
और @protected
ivars किसी भी वर्ग के ऑब्जेक्ट द्वारा एक्सेस किए जा सकते हैं। ये दृश्यता संशोधक बस स्रोत कोड को मशीन कोड में संकलित करना मुश्किल बनाते हैं जो दृश्यता संशोधक के इरादे का उल्लंघन करता है।
सुरक्षा के लिए आइवर दृश्यता संशोधक पर भरोसा मत करो! वे बिल्कुल भी नहीं प्रदान करते हैं। वे क्लास-बिल्डर की इच्छाओं के संकलन-समय प्रवर्तन के लिए कड़ाई से हैं।