3

インスタンス変数とプロパティの間で非常に混乱しています。これに関する多くの投稿を読みましたが、まだ明確ではありません。私はJAVAのバックグラウンドから来ており、Objective Cのドキュメントから推測することは、プロパティがJAVA BEAN CLASS(インスタンス変数のゲッターとセッターを持つもの)に似ているということです。インスタンス変数はプライベートであり、他のクラスからはアクセスできませんが、プロパティは getter および setter メソッドを介して他のクラスからアクセスできます。

この方向で考えるのは正しいですか?

4

7 に答える 7

4

Java との類似性は非常に優れています。唯一の違いは、Objective C は変数であるかのようにプロパティにアクセスする方法を提供しますが、Java は提供しないことです。もう 1 つの違いは、Objective Cではプロパティを合成できるのに対し、Java ではゲッターとセッターを手動で作成する必要があることです。

プロパティは、getter メソッドまたは getter メソッドと setter メソッドのペアに対する「構文糖衣」です。多くの場合 (常にではありません)、プロパティはインスタンス変数によってサポートされますが、パラメーターなしのインスタンス メソッドを実装できる任意の方法で実装できます。

于 2012-04-12T11:24:43.817 に答える
2

私はこの主題がここで殴り殺されたことを知っています...しかし、いくつかは技術的な詳細に焦点を当てているようですが、私は大きな写真の線に沿って何かを言及したかったです...

プロパティを一種のファーストクラスのivarと考えてください。プロパティとivarの両方がオブジェクトの属性をモデル化する可​​能性があります...しかし、先に進んでそれをプロパティとして設定すると、ivarは特別な注意を引きます。基本的に、getter / setterメソッドが必要だと思われる場合は、属性を(ivarではなく)プロパティとして使用する必要があります。ドット表記は非常に読みやすいコードになります。これは、単に通常のivarを使用するのではなく、変数をプロパティとして宣言するタイミングを決定するのに役立つ場合があります。

于 2012-10-05T13:53:03.483 に答える
2

わかりました、インスタンス変数とプロパティは互いに遠く離れています。インスタンス変数はオブジェクトの状態であり、プロパティはその状態(インスタンス変数)の継承メソッド(ゲッター/セッター)です。

そのため、ヘッダー ファイルにプロパティを作成するたびに。コンパイラは、これらのプロパティをアクセサ メソッドに変換します。プロパティを宣言したとします-@property(nonatomic, assign, readwrite) NSString *name; したがって、コンパイラはそれらをに変換します

-(NSString *)name;
-(void)setName:(NSString *)name;

そして、アクセサメソッドの定義には2つの方法があります。

  1. 手動で - 実装ファイル (.m) で動的を使用し、これを行うことでアクセサ メソッドの定義を指定すると、警告は表示されません。

  2. コンパイラーに仕事をさせましょう - これは、プロパティを合成することによって行うことができますsynthesize name;。そのため、コンパイラはアクセサ メソッドの定義を生成します。

それが役に立てば幸い ;)

于 2012-04-12T11:29:48.460 に答える
1

オブジェクト c のプロパティは、実際には、クラスの外部からクラス内の属性にアクセスできるようにするセッター メソッドとゲッター メソッドです。たとえば、宣言するとき

@interface example:NSObject{
    NSString *variable;
}
@property(readwrite, assign) NSString *variable;
@end

@implementation
@synthesize variable;
@end

あなたは実際にメソッドを宣言しています

-(NSString *)getVariable;
-(void)setVariable(NSString *)value;

そして、ポイント表記とプロパティの名前を使用してアクセスできます。

instance.variable = something;
something = instance.variable;
于 2012-04-12T11:26:05.767 に答える
1

まあ、プロパティがインスタンス変数を必要としないことは明らかではなかったかもしれません。インスタンス変数またはスコープ内の他の変数の計算に基づいて、読み取り専用プロパティを定義できます。ここでの問題は、getter を手動でコーディングする必要があることです。

@interface person:NSObject{
    NSDate *birthDate;
}
@property(readonly) int age;
@end

@implementation

-(int) age{
 // return calculated age based on birthDate and today;
}
@end

プロパティの名前は、インスタンス変数と同じである必要はありません。

@synthesize myProperty = myVar;
于 2012-04-12T13:07:11.557 に答える
1

インスタンス変数プロパティの主な違いは、プロパティの場合、コンパイラが getter/setter メソッドのペアを自動的に生成することです。例えば:

@property (nonatomic) int value;

生成されます:

-(void)setValue:(int)i
{
    value = i;
}
-(int)value
{
    return self->value;
}

与えられた@synthesized。

Objective-C 1.0 に関する本を読んでいると、この機能が利用できないことに気付くでしょう。これは 2.0 の新機能で、ドット構文とも呼ばれます。これは主に複雑な getter/setter 構文のために導入されました。

この機能の利点は、コンパイラが自動的にペアを宣言したとしても、それをオーバーライドできることです。たとえば-(void)setValue:(int)i、クラスのメソッドとして宣言したままで、動作をオーバーライドすることができます。これは、 の範囲に制限を設けるなど、検証のシナリオで役立ちますvalue

Java に関する限り、Objective-C には実際に@publicインスタンス変数の構文がありますが、それを使用しないのが習慣です。これは、getter/setter を介してプライベート変数を保護するという Java の概念に似ています。しかし、その主な目的 c は、getter/setter をオーバーライドして構文を最小限に抑えることです。

これは単なるプレビューです。詳細を知りたい場合は、 http://cocoacast.com/ ?q=node/103 または Objective-C 2.0 の書籍を参照してください。

于 2012-04-12T11:33:00.820 に答える
0

プロパティに関するすべてのことを明確に説明しているこの素晴らしいスレッドを見つけました。

http://www.iphonedevsdk.com/forum/iphone-sdk-tutorials/7295-getters-setter-properties-newbie.html

ご回答ありがとうございます。

于 2012-04-13T06:54:35.293 に答える