何よりもまず、私の答えは最新の Clang コンパイラに基づいており、古いバージョンでは動作が若干異なります。
したがって、どちらにもオブジェクトを作成していません。そのうちの 2 つでオブジェクトを宣言していません。
text
最初のケースでは、実際には typeというプロパティを公開する必要があることをコンパイラに伝えていますNSString
。コンパイラが行うことは、インスタンス変数_text
(ちなみに問題なくアクセスできます) と、そのインスタンス変数を取得および設定するために必要なメソッドを宣言することです。ご覧のとおり、ストレージはまだ内部にあり、getter と setter が設定されているだけです。
2 番目のケースでは、コンパイラが_text
. 接頭辞を付けるのが慣習_
です。ストレージはまだ内部にあります。その上、getter または setter がなく、暗黙の宣言が であるため、外部から ivar にアクセスすることはできません@private
。
3 番目のケースでは、クラスにプロパティを追加する匿名カテゴリ (つまり、空の括弧) を作成します。このストレージの説明は少し難しく/長くなります。興味がある場合は、Apple のドキュメントを検索して、カテゴリとは何かなどを確認してください。この場合、クラス内からのみプロパティにアクセスできるため、何らかの形で冗長になります (ゲッターとセッター)。ivar として宣言することもできます。
次のように ivar を宣言することもできます。
@interface GenericViewController : UIViewController{
NSString * text;
}
@end
@implementation GenericViewController{
NSString * text;
}
@end
上記の両方に、ローカル ストレージとプライベートな可視性があります (外部からアクセスできません)。2 つの違いは、実装で宣言されたインスタンス変数が暗黙的に非表示になり、可視性を @public、@protected、および @private で変更できないことです。これらのディレクティブを使用すると、コンパイラ エラーは発生しませんが、無視されます。