Вопрос

Что значит @private Значит в Objective-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 могут получить доступ ко всем IVARS друг друга напрямую; Предполагается, что, поскольку программист имеет полный контроль над этим классом напрямую, он будет использовать эту способность с умом.

Важно понять, что это значит, когда кто -то говорит, что вы не можете получить доступ к @private переменная экземпляра. Реальная история заключается в том, что компилятор даст вам ошибку, если вы попытаетесь получить доступ к этим переменным в своем исходном коде. В предыдущих версиях GCC и Xcode вы просто получите предупреждение вместо ошибки.

В любом случае, во время выполнения все ставки выключены. Эти @private а также @protected IVARS может быть доступен объектом любого класса. Эти модификаторы видимости просто затрудняют составление исходного кода в машинный код, который нарушает намерение модификаторов видимости.

Не полагайтесь на модификаторы видимости ivar для безопасности! Они вообще не дают. Они строго предназначены для соблюдения пожеланий времени составления пожеланий класса-строителя.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top