Co oznacza" @private " W Objective-C?

Co oznacza @private w Objective-C?

Author: Jeff Wolski, 2009-05-10

3 answers

Jest to modyfikator Widoczności - oznacza to, że zmienne instancji zadeklarowane jako @private mogą być dostępne tylko przez instancje tej samej klasy . Do członków prywatnych nie mają dostępu podklasy ani inne klasy.

Na przykład:

@interface MyClass : NSObject
{
    @private
    int someVar;  // Can only be accessed by instances of MyClass

    @public
    int aPublicVar;  // Can be accessed by any object
}
@end

Aby wyjaśnić, metody są zawsze publiczne w Objective-C. Istnieją jednak sposoby "ukrywania" deklaracji metod-zobacz to pytanie, aby uzyskać więcej informacji.

 183
Author: hbw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:25

Jak powiedział htw, to modyfikator widoczności. @private oznacza, że Ivar (zmienna instancji) może być dostępna tylko bezpośrednio z instancji tej samej klasy. Może to jednak niewiele dla ciebie znaczy, więc podam ci przykład. Dla uproszczenia użyjemy metod init klas jako przykładów. Będę komentować w wierszu, aby wskazać interesujące elementy.

@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;
}

Aby odpowiedzieć na twoje pytanie, @private chroni ivars przed dostępem instancji każdej innej klasy. Zauważ, że dwie instancje MyFirstClass mogą uzyskać bezpośredni dostęp do wszystkich swoich ivarów; zakłada się, że ponieważ programista ma pełną kontrolę nad tą klasą bezpośrednio, będzie mądrze używał tej zdolności.

 160
Author: BJ Homer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-31 07:29:04

Ważne jest, aby zrozumieć, co to znaczy, gdy ktoś mówi, że nie możesz uzyskać dostępu do zmiennej instancji @private. Prawdziwa historia jest taka, że kompilator wyświetli błąd, jeśli spróbujesz uzyskać dostęp do tych zmiennych w kodzie źródłowym. W poprzednich wersjach GCC i XCode, po prostu dostać ostrzeżenie zamiast błędu.

/ Align = "left" / Te @private i @protected Ivary mogą być dostępne przez obiekt dowolnej klasy. Te modyfikatory widoczności sprawiają, że trudno skompilować kod źródłowy do kodu maszynowego, który narusza intencje modyfikatorów widoczności.

Nie polegaj na modyfikatorach widoczności ivar dla bezpieczeństwa! Nie zapewniają one w ogóle. Są one ściśle do wykonania w czasie kompilacji życzeń konstruktora klasy.

 14
Author: Jeff Wolski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-02 23:54:03