Frage

Was macht @private meine in objective-c?

War es hilfreich?

Lösung

Es ist ein Sichtbarkeitsmodifikator- Es bedeutet, dass Instanzvariablen als als deklariert als als deklariert @private kann nur von zugegriffen werden von Instanzen derselben Klasse. Private Mitglieder können nicht durch Unterklassen oder andere Klassen zugegriffen werden.

Zum Beispiel:

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

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

Um zu verdeutlichen, sind Methoden in objektivem C immer öffentlich. Es gibt jedoch Möglichkeiten, Methodendeklarationen zu "verstecken" diese Frage für mehr Informationen.

Andere Tipps

Wie HTW sagte, ist es ein Sichtbarkeitsmodifikator. @private bedeutet, dass auf den IVAR (Instanzvariable) nur innerhalb einer Instanz derselben Klasse direkt aus zugegriffen werden kann. Das bedeutet Ihnen jedoch möglicherweise nicht viel. Lassen Sie mich Ihnen ein Beispiel geben. Wir werden das verwenden init Methoden der Klassen als Beispiele, der Einfachheit halber willen. Ich werde Inline kommentieren, um auf Interesse zu weist.

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

Um Ihre Frage zu beantworten, schützt @Private Ivars vor Zugang durch eine Instanz einer anderen Klasse. Beachten Sie, dass zwei Fälle von MyFirstclass direkt auf alle Ivars des anderen zugreifen könnten. Es wird angenommen, dass der Programmierer diese Fähigkeit mit Bedacht nutzen wird, da er die vollständige Kontrolle über diese Klasse hat.

Es ist wichtig zu verstehen, was es bedeutet, wenn jemand sagt, dass Sie nicht auf einen zugreifen können @private Instanzvariable. Die wahre Geschichte ist, dass der Compiler Ihnen einen Fehler gibt, wenn Sie versuchen, auf diese Variablen in Ihrem Quellcode zuzugreifen. In früheren Versionen von GCC und Xcode würden Sie nur eine Warnung anstelle eines Fehlers erhalten.

In jedem Fall sind alle Wetten zur Laufzeit ausgeschaltet. Diese @private und @protected Ivars können von einem Objekt jeder Klasse zugegriffen werden. Diese Sichtbarkeitsmodifikatoren machen es nur schwierig, den Quellcode in den Maschinencode zu kompilieren, der gegen die Absicht der Sichtbarkeitsmodifikatoren verstößt.

Verlassen Sie sich nicht auf IVAR -Sichtbarkeitsmodifikatoren für Sicherheit! Sie liefern überhaupt keine. Sie sind ausschließlich für die Durchsetzung der Wünsche des Klassenbauers für die Kompilierung der Zeit.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top