¿Qué significa "@ privado " en Objective-C?


¿Qué significa @private en Objective-C?

Author: Jeff Wolski, 2009-05-10

3 answers

Es un modificador de visibilidad -significa que las variables de instancia declaradas como@private solo pueden ser accedidas por instancias de la misma clase . No se puede acceder a los miembros privados por subclases u otras clases.

Por ejemplo:

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

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

También, para aclarar, los métodos son siempre públicos en Objective-C. Hay maneras de "ocultar" declaraciones de métodos, sin embargo-ver esta pregunta para más información.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:25

Como dijo htw, es un modificador de visibilidad. @private significa que la ivar (variable de instancia) solo se puede acceder directamente desde una instancia de la misma clase. Sin embargo, eso puede no significar mucho para ti, así que déjame darte un ejemplo. Usaremos los métodos init de las clases como ejemplos, por simplicidad. Voy a comentar en línea para señalar los elementos de interés.

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

Así que para responder a su pregunta, @private protege a ivars del acceso por una instancia de cualquier otra clase. Tenga en cuenta que dos instancias de MyFirstClass podrían acceder a todos los ivars de cada uno directamente; se supone que dado que el programador tiene control completo sobre esta clase directamente, usará esta habilidad sabiamente.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-31 07:29:04

Es importante entender lo que significa cuando alguien dice que no se puede acceder a una variable de instancia @private. La historia real es que el compilador le dará un error si intenta acceder a estas variables en su código fuente. En versiones anteriores de GCC y XCode, solo recibiría una advertencia en lugar de un error.

De cualquier manera, en tiempo de ejecución, todas las apuestas están canceladas. Estos @private y @protected ivars pueden ser accedidos por un objeto de cualquier clase. Estos modificadores de visibilidad solo lo hacen difícil compilar el código fuente en código máquina que viole la intención de los modificadores de visibilidad.

¡No confíe en los modificadores de visibilidad ivar para la seguridad! No proporcionan nada en absoluto. Son estrictamente para la ejecución en tiempo de compilación de los deseos del constructor de clases.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-02 23:54:03