Objective-C プロパティを使用する場合、インスタンス変数の作成を完全に停止するか、明示的なインスタンス変数 (プロパティによって合成されたものではない) を使用して、プロパティが不適切な場合でも目的を果たすことができますか?
4 に答える
インスタンス変数の作成を完全に停止できますか
いいえ、できません(ある意味で)。プロパティがある場合にできることは、それらの宣言を停止することです。プロパティを合成し、instvar を宣言していない場合は、宣言されるため、明示的にではなく、インスタンス変数を作成しています。
プロパティが不適切な場合でも、それらは目的を果たしますか?
合成されたプロパティを使用すると、ほとんどすべての保持と解放が行われるため、以前はすべてのプロパティを作成することをお勧めしていました。ただし、ARC では、プロパティを使用してメモリ管理をラップする理由はなくなりました。現在 (ARC の場合) のアドバイスは、プロパティを使用して外部インターフェイスを宣言することですが、変数がオブジェクトの内部状態の一部である直接インスタンス変数を使用することです。
これは、ARC を採用する正当な理由です。プロパティは、クラスの API の一部であるという本来の目的に戻り、メモリ管理作業を隠すためのハックな方法として使用する必要がなくなります。
編集
もう 1 つ: でインスタンス変数を宣言できるようになった@implementation
ため、 で実装の詳細をリークする必要がなくなりました@interface
。すなわち
@implementation MyClass
{
NSString* myString;
}
// method definitions
@end
また、カテゴリでも機能すると確信しています。- 以下のコメントを参照
すべてをプロパティとして宣言し、手動の ivar を完全に避けることをお勧めします。ivar を手動で作成するメリットはありません。ヘッダー@interface
でパブリック プロパティを宣言し、.m ファイルのプライベート クラス拡張子でプライベート プロパティを宣言します。
JeremyP のいくつかのポイントでは、メモリ管理はもはや重要な問題ではありませんが、アクセサーの内部使用は依然として ARC の下で重要な価値を持っています。これにより、KVO が適切に動作し、サブクラスが改善され、カスタム セッター (特に などNSTimer
) がサポートされ、カスタム ゲッター (遅延インスタンス化など) がサポートされるようになります。アクセサーと ivar が混在していると、非常にエラーが発生しやすくなります。どの方法でアクセスする必要があるかを簡単に忘れてしまいます。一貫性は優れた ObjC の特徴です。
何らかの理由で絶対に ivar を宣言する必要がある場合は、@implementation
JeremyP が指摘するように、ブロック内で宣言する必要があります。
更新 (2013 年 10 月):
Apple のガイダンス(Objective-C によるプログラミング: データのカプセル化から):
ほとんどのプロパティはインスタンス変数によってサポートされています
一般に、独自の実装内からオブジェクトのプロパティにアクセスしている場合でも、プロパティ アクセスにはアクセサ メソッドまたはドット構文を使用する必要があります。その場合は、次を使用する必要があります
self
。...
この規則の例外は、このセクションで後述するように、初期化、割り当て解除、またはカスタム アクセサー メソッドを記述する場合です。
この質問はここの前に扱われました
インスタンス変数を使用するsynthesize
と、変数が処理され、インスタンス化されます。新しいバージョンのXCodeでLionを使用している場合は、ARCへの移行のARCのさまざまなプロパティも確認してください。
いつでも外部からプロパティにアクセスできます。したがって、変数をクラス内からのみ読み取る必要がある場合でも、iVarを宣言する必要があります。また、でパブリックivarにアクセスするobject->ivar
方が、メソッド呼び出しを使用するよりもわずかに高速です。