ios site O que significa "@private" em Objective-C?




swift history (3)

O que @private significa em Objective-C?


É um modificador de visibilidade - isso significa que variáveis ​​de instância declaradas como @private só podem ser acessadas por instâncias da mesma classe . Membros privados não podem ser acessados ​​por subclasses ou outras classes.

Por exemplo:

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

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

Além disso, para esclarecer, os métodos são sempre públicos em Objective-C. Existem maneiras de "esconder" declarações de método, embora - veja esta questão para mais informações.


Como disse htw, é um modificador de visibilidade. @private significa que o ivar (variável de instância) só pode ser acessado diretamente de dentro de uma instância da mesma classe. No entanto, isso pode não significar muito para você, então deixe-me dar um exemplo. Usaremos os métodos init das classes como exemplos, para simplificar. Vou comentar em linha para apontar itens de 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;
}

Então, para responder à sua pergunta, @private protege ivars do acesso por uma instância de qualquer outra classe. Note que duas instâncias de MyFirstClass poderiam acessar todos os ivars uns dos outros diretamente; presume-se que, como o programador tem controle completo sobre essa classe diretamente, ele usará essa habilidade com sabedoria.


É importante entender o que significa quando alguém diz que você não pode acessar uma variável de instância @private . A verdadeira história é que o compilador lhe dará um erro se você tentar acessar essas variáveis ​​em seu código-fonte. Nas versões anteriores do GCC e do XCode, você só receberia um aviso em vez de um erro.

De qualquer forma, em tempo de execução, todas as apostas estão desativadas. Esses @private e @protected podem ser acessados ​​por um objeto de qualquer classe. Esses modificadores de visibilidade dificultam a compilação do código-fonte em código de máquina que viola a intenção dos modificadores de visibilidade.

Não confie em modificadores de visibilidade ivar para segurança! Eles fornecem nenhum em tudo. Eles são estritamente para cumprimento em tempo de compilação dos desejos do construtor da classe.







private