@private
Objective-Cの意味は何ですか?
@private
Objective-Cの意味は何ですか?
回答:
これは可視性修飾子です。つまり、同じクラスのインスタンス@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ではメソッドは常にパブリックです。ただし、メソッド宣言を「隠す」方法はいくつかあります。詳細については、この質問を参照してください。
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に直接アクセスできることに注意してください。プログラマはこのクラスを直接完全に制御できるため、この機能を賢く使用することが想定されています。
@private
オブジェクトのテンプレートを挿入するので、もはやそれほど珍しいことではありません。
@implementation
ブロックに直接置くことができます。そして、一度それを実行すると、可視性修飾子に関係なく、それらはそのファイルの外部の誰にも見えないため、事実上プライベートになります。
@private
インスタンス変数にアクセスできないと誰かが言ったときの意味を理解することが重要です。実際の話は、ソースコードでこれらの変数にアクセスしようとすると、コンパイラーがエラーを表示するということです。以前のバージョンのGCCとXCodeでは、エラーではなく警告が表示されるだけでした。
いずれにせよ、実行時には、すべてのベットがオフになっています。これら@private
と@protected
ivarには、任意のクラスのオブジェクトからアクセスできます。これらの可視性修飾子は、ソースコードを可視性修飾子の意図に違反するマシンコードにコンパイルすることを困難にします。
セキュリティのためにivar可視性修飾子に依存しないでください!彼らは何も提供しません。これらは、クラスビルダーの希望をコンパイル時に強制するためのものです。