web-dev-qa-db-ja.com

Objective-Cで「@private」とはどういう意味ですか?

Objective-Cで@privateはどういう意味ですか?

279
user100051

これは可視性修飾子です。つまり、@privateとして宣言されたインスタンス変数は、インスタンスによってのみアクセスできることを意味します。同じクラスの。プライベートメンバーは、サブクラスまたは他のクラスからアクセスできません。

例えば:

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

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

また、明確にするために、Objective-Cではメソッドは常に公開されています。ただし、メソッド宣言を「隠す」方法があります。詳細については この質問 を参照してください。

187
hbw

Htwが言ったように、それは可視性修飾子です。 @privateは、ivar(インスタンス変数)が同じクラスのインスタンス内からのみ直接アクセスできることを意味します。しかし、それはあなたにとってあまり意味がないかもしれないので、例を挙げましょう。簡単にするために、クラスのinitメソッドを例として使用します。興味のある項目を指摘するためにインラインでコメントします。

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

したがって、質問に答えるために、@ privateは、他のクラスのインスタンスによるアクセスからivarを保護します。 MyFirstClassの2つのインスタンスは、互いのすべてのivarに直接アクセスできることに注意してください。プログラマーはこのクラスを直接完全に制御できるため、この能力を賢く使用すると想定されています。

162
BJ Homer

@privateインスタンス変数にアクセスできないと誰かが言ったときの意味を理解することが重要です。実際の話は、ソースコードでこれらの変数にアクセスしようとすると、コンパイラがエラーを表示するということです。 GCCおよびXCodeの以前のバージョンでは、エラーではなく警告が表示されるだけでした。

いずれにせよ、実行時に、すべてのベットがオフになります。これらの@privateおよび@protected ivarは、任意のクラスのオブジェクトからアクセスできます。これらの可視性修飾子は、ソースコードを可視性修飾子の意図に違反するマシンコードにコンパイルすることを単に難しくします。

セキュリティのためにivar可視性修飾子に依存しないでください!彼らはまったく何も提供しません。これらは、クラス作成者の希望をコンパイル時に強制するためのものです。

14
Jeff Wolski