سؤال

ماذا فعلت @private يعني في الهدف-C؟

هل كانت مفيدة؟

المحلول

انه معدل الرؤية- هذا يعني أن متغيرات المثيل أعلنتها @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

أيضا ، لتوضيح ، الأساليب هي دائما عامة في الهدف-C. هناك طرق لإعلانات طريقة "الاختباء" ، رغم ذلك - انظر هذا السؤال للمزيد من المعلومات.

نصائح أخرى

كما قال 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;
}

للإجابة على سؤالك ، يحمي private ivars من الوصول بواسطة مثيل لأي فصل آخر. لاحظ أن حالتين من myfirstclass يمكن أن تصل إلى كل من إيفار بعضهما البعض مباشرة ؛ من المفترض أنه نظرًا لأن المبرمج لديه سيطرة كاملة على هذه الفئة مباشرة ، فسوف يستخدم هذه القدرة بحكمة.

من المهم أن نفهم ما يعنيه عندما يقول شخص ما أنه لا يمكنك الوصول إلى ملف @private المتغيرات الخاصة. القصة الحقيقية هي أن المترجم سيعطيك خطأً إذا حاولت الوصول إلى هذه المتغيرات في رمز المصدر الخاص بك. في الإصدارات السابقة من GCC و XCODE ، ستحصل على تحذير بدلاً من خطأ.

في كلتا الحالتين ، في وقت التشغيل ، كل الرهانات متوقفة. هؤلاء @private و @protected يمكن الوصول إلى Ivars بواسطة كائن من أي فئة. تجعل معدلات الرؤية هذه فقط من الصعب تجميع الكود المصدر في رمز الجهاز الذي ينتهك نية المعدلات الرؤية.

لا تعتمد على معدلات رؤية IVAR للأمن! أنها لا توفر أيا على الإطلاق. فهي بدقة لإنفاذ وقت الترجمة لرغبات البناء الطبقي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top