Domanda

Cosa fa @private significa in Objective-C?

È stato utile?

Soluzione

È un modificatore di visibilità—significa che le variabili di istanza dichiarate come @private è possibile accedervi solo da istanze della stessa classe.Non è possibile accedere ai membri privati ​​tramite sottoclassi o altre classi.

Per esempio:

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

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

Inoltre, per chiarire, i metodi sono sempre pubblici in Objective-C.Esistono però dei modi per "nascondere" le dichiarazioni dei metodi: vedere questa domanda per maggiori informazioni.

Altri suggerimenti

Come ha detto HTW, è un modificatore di visibilità. @private significa che l'IVAR (variabile di istanza) è accessibile solo direttamente da un'istanza della stessa classe. Tuttavia, ciò potrebbe non significare molto per te, quindi lascia che ti faccia un esempio. Useremo il init Metodi delle classi come esempi, per motivi di semplicità. Commenterò in linea per sottolineare gli elementi di interesse.

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

Quindi, per rispondere alla tua domanda, @Private protegge Ivars dall'accesso da un'istanza di qualsiasi altra classe. Si noti che due istanze di MyFirstclass potrebbero accedere direttamente a tutti gli Ivars degli altri; Si presume che, poiché il programmatore abbia il controllo completo su questa classe direttamente, utilizzerà saggiamente questa abilità.

È importante capire cosa significa quando qualcuno dice che non puoi accedere a @private variabile di istanza. La vera storia è che il compilatore ti darà un errore se si tenta di accedere a queste variabili nel codice sorgente. Nelle versioni precedenti di GCC e Xcode, otterresti solo un avviso anziché un errore.

Ad ogni modo, in fase di esecuzione, tutte le scommesse sono spente. Queste @private e @protected Ivars è possibile accedere a un oggetto di qualsiasi classe. Questi modificatori di visibilità rendono difficile compilare il codice sorgente nel codice macchina che viola l'intento dei modificatori di visibilità.

Non fare affidamento su modificatori di visibilità Ivar per la sicurezza! Non ne forniscono affatto. Sono rigorosamente per l'applicazione a tempo di compilazione dei desideri del costruttore di classe.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top