236 votes

Que signifie "@private" en Objective-C ?

Qu'est-ce que @private signifie-t-il en Objective-C ?

165voto

htw Points 10312

C'est un modificateur de visibilité -cela signifie que les variables d'instance déclarées comme @private ne peut être accessible que par instances de la même classe . Les membres privés ne sont pas accessibles aux sous-classes ou aux autres classes.

Par exemple :

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

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

De plus, pour clarifier, les méthodes sont toujours publiques en Objective-C. Il existe cependant des moyens de " cacher " les déclarations de méthodes, voir cette question pour plus d'informations.

143voto

BJ Homer Points 29168

Comme l'a dit htw, c'est un modificateur de visibilité. @private signifie que l'on ne peut accéder directement à l'ivar (variable d'instance) qu'à partir d'une instance de cette même classe. Cependant, cela ne signifie peut-être pas grand-chose pour vous, alors laissez-moi vous donner un exemple. Nous allons utiliser la variable init des classes à titre d'exemple, pour des raisons de simplicité. Je commenterai en ligne pour signaler les éléments intéressants.

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

Donc, pour répondre à votre question, @private protège les ivars de l'accès par une instance de toute autre classe. Notez que deux instances de MyFirstClass pourraient accéder directement à tous les ivars de l'autre ; on suppose que puisque le programmeur a un contrôle total sur cette classe directement, il utilisera cette capacité à bon escient.

8voto

Jeff Wolski Points 3956

Il est important de comprendre ce que cela signifie lorsque quelqu'un dit que vous ne pouvez pas accéder à un @private variable d'instance. En réalité, le compilateur vous donnera une erreur si vous tentez d'accéder à ces variables dans votre code source. Dans les versions précédentes de GCC et XCode, vous receviez simplement un avertissement au lieu d'une erreur.

Quoi qu'il en soit, au moment de l'exécution, tous les paris sont ouverts. Ces @private et @protected Les ivars sont accessibles à un objet de n'importe quelle classe. Ces modificateurs de visibilité rendent simplement difficile la compilation du code source en code machine qui viole l'intention des modificateurs de visibilité.

Ne comptez pas sur les modificateurs de visibilité de l'ivar pour la sécurité ! Ils n'en fournissent aucune. Ils sont strictement destinés à l'application à la compilation des souhaits du constructeur de la classe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X