0

これが、Objective-C のプロパティについて私が知っていることです。これらが事実でない場合は、訂正してください。

  1. プロパティを宣言するとき、インスタンス変数のセッター/ゲッターを宣言しています
  2. セッターとゲッターを定義したい場合は、それらを合成する必要があります
  3. 合成すると、インスタンス変数が定義されます。ベスト プラクティスは、getter と iVar が同じ名前にならないように、iVar の名前を変更することです。したがって、通常は次のようにします: @synthesize myVar = _myVar

プロパティに関する私の知識はすべて、インスタンス変数と結びついています。最近、セッター/ゲッター以外のインスタンス メソッドにプロパティを使用できるというビデオを見ました。

これは本当ですか?もしそうなら、どのように、そしてなぜこのようにプロパティを使用しますか? たとえば、プロトコルに関するスタンフォード cs193p ビデオを見ていましたが、プロトコルにプロトタイプを作成できると書かれていました。私は誤解することができました。

とにかく反応してくれた人ありがとう

4

3 に答える 3

2

プロパティを宣言するときは、インスタンス変数のセッター/ゲッターを宣言します

いいえ、あなたはゲッターとおそらくプロパティのセッターを宣言しています。限目。プロパティの宣言自体は、インスタンス変数を意味するものではありません。プロパティを実装する方法はたくさんあります。インスタンス変数はたまたま一般的で一般的な方法ですが、非ivarプロパティは非常に一般的です。

セッターとゲッターを定義したい場合は、それらを合成する必要があります

いいえ。(セルヒオが指摘しているように、私はもともと「定義済み」と「宣言済み」を混同していました。)ほとんど。@property行自体がセッターとゲッターを宣言します。セッターとゲッターを実装する場合、これは「合成」と呼ばれますが、手動で行う必要はありません。コンパイラーは、宣言したが実装していないプロパティに対してゲッターとセッターを自動的に作成します(明示的に使用しないように要求しない限り@dynamic)。

合成する場合、インスタンス変数が定義されます。ベストプラクティスは、ゲッターとiVarが同じ名前にならないようにiVarの名前を変更することです。したがって、通常は次のようにします。@synthesize myVar = _myVar

ほとんど。これは数か月前に当てはまりましたが、実際にそれを行う必要はなくなりました@synthesize。これで、コンパイラによって自動的に実行されます。

このヘッダー:

@interface MyObject : NSObject
@property (nonatomic, readwrite, strong) NSString *something;
@end

このヘッダーとほぼ同じです:

@interface MyObject : NSObject
- (NSString *)something;
- (void)setSomething:(NSString *)something;
@end

これら2つの間には非常に小さな違いがいくつかあり、ランタイムに関連するものとコンパイラに関連するものがありますが、同じふりをするだけでより明確になります。

これらの両方の場合に行っているのは、いくつかのメソッドを宣言することだけです。あなたはそれらがどのように実装されているかを宣言していません。あなたはivarsを宣言していません。メソッドを宣言しているだけです。これで、これらのメソッドを好きなように自由に実装できます。必要に応じて、コンパイラにデフォルトの実装を合成させることで、それらを実装できます。必要に応じて、手動で実装できます。必要に応じて、それぞれ1つずつ実行できます。

于 2013-01-15T14:53:53.773 に答える
1

Xcode 4.4 以降、プロパティはデフォルトで合成されます。そのため、プロパティ (myVar) を宣言するだけで済みます。また、self.myVar にアクセスする代わりに使用できる _myVar も用意されています。

于 2013-01-15T14:48:47.027 に答える
0

プロパティをパラメーターなしのメソッドとして使用することは、プロパティをそうでないものにねじ曲げることです。

于 2013-01-15T15:16:40.783 に答える