1

Xcode で空のプロジェクトを作成しました。これは、ウィンドウ オブジェクトを使用して App Delegate をセットアップするだけです。

AppDelegate.h が@propertyforを作成している間window:

@property (strong, nonatomic) UIWindow *window;

.hまたは.mivarのどちらにも言及はありませんが_windowdeallocショーは次のとおりです。

- (void)dealloc
{
[_window release];
[super dealloc];
}

私の質問は、@propertyプロパティの関連 ivar のアンダースコアを含む ivar を自動的に作成することですか? みたいなことを書かないと@synthesize window=_window、プロパティとivarは同じ名前だと思いました。ただし、そのような(または任意の)@synthesizeステートメントは.mどこ_windowから来たのでしょうか?

4

2 に答える 2

2

Xcode 4.4 のデフォルト コンパイラである LLVM 4.0 は、宣言されたプロパティを自動的に合成する自動合成と呼ばれる新しい機能を提供ます (プロトコルで宣言されていない場合)。ゲッターとセッター (必要な場合) の実装の合成に加えて、自動合成は、アンダースコアで始まるインスタンス変数も合成します。したがって、次の宣言が与えられた場合...

@property (strong, nonatomic) NSString *foo;

...コンパイラは、名前付きのインスタンス変数と、_fooアクセスするメソッドの実装を合成します。foosetFoo:_foo

于 2012-08-26T12:01:09.787 に答える
1

いいえ、対応する ivar は@property/@synthesizeメカニズムによって自動的に作成されます。コンパイラは、デフォルトの命名規則 (プロパティ名と等しい ivar の名前) で ivar を自動的に作成します。これは表示されませんが、存在し、参照できます。

ステートメントで:

@synthesize window=_window; 

デフォルトと同じivar名を持つプロパティを合成しています。

次のように、デフォルトとは異なる ivar の別の名前を指定できます。

@synthesize window=iVarWindow;

ノート

最初のケースでは、前にアンダースコアを付けて ivar の名前を指定しています (デフォルトの実装では、ivar の名前はプロパティの名前と同じでした)。2 番目のケースでは、カスタム名を指定しています。 .

プロパティを (@synthesize実装ファイルで) 合成しない場合、コンパイラはアクセサー メソッドを自動的に生成しません。この場合、自分でアクセサー メソッドを作成する必要があります。とにかく ivar は によって作成される@propertyので、 を持っていなくても@synthesize、プロパティに関連する ivar があります。:-)


アップデート

Xcode 4.4 の新しいバージョンでは、プロパティの @synthesize ステートメントがなくても、コンパイラはアクセサー メソッドを自動的に生成します。

于 2012-08-26T08:30:58.723 に答える