1

私の教授は、Xcode4.6で次のように呼び出していることを何度か明示的に教えてくれました。

@synthesize suit;

呼び出しと同じです:

@synthesize suit = _suit;

その中で、Xcodeはivarを作成し、アンダーバーの命名規則で名前を付けます(例で@property suitは、という名前のivarを取得します_suit

しかし、私はドキュメンテーションを見ていて、AppleDocumentationEncapsulatingDataでこの一節を見つけまし

重要:次のように、インスタンス変数名を指定せずに@synthesizeを使用する場合:@synthesize firstName; インスタンス変数には、プロパティと同じ名前が付けられます。この例では、インスタンス変数もアンダースコアなしでfirstNameと呼ばれます。

これは私の教授と直接矛盾しているようです。:(

これが私が知っていることです。Xcode 4.6では、@property宣言されたものはすべて@synthesize自動的に-edされるため、を呼び出す必要はありません@synthesize。Xcodeに自動合成を許可すると、ivarアンダーバー名(_suit)が使用されます。ただし、カスタムのゲッターとセッターを実装する場合は、@synthesize明示的に呼び出す必要があります。

私の質問はこれです。カスタムのゲッターとセッターがあり(私が持っているように)、呼び出す必要がある@ synthesize場合、名前を指定しない場合、Xcodeはデフォルトのアンダーバー命名スキームを使用しますか?

たとえば、私がこれを呼び出すとき:

@synthesize suit;

Xcodeは基礎となるivarに名前を付けますsuit_suit

私の簡単なテストとドキュメントを読むと、私の教授が思っているように@synthesize suit;なり@synthesize suit = suit、そうではないように見えます。@synthesize suit = _suit私は完全な新人で、プロパティに頭を巻いて合成しているだけなので、あなたの助けが必要です。

また、これを自分でテストしたり、ドキュメントで実際の答えを見つけたりするにはどうすればよいですか?ありがとう。

4

2 に答える 2

7

これが公式の言葉です - Programming with Objective C Encapsulating Data、そしておそらく混乱の原因

ほとんどのプロパティはインスタンス変数によってサポートされています

特に指定しない限り、合成されたインスタンス変数はプロパティと同じ名前ですが、アンダースコアの接頭辞が付いています。たとえば、firstName というプロパティの場合、合成されたインスタンス変数は _firstName と呼ばれます。

同じページのさらに下(引用した部分)...

合成されたインスタンス変数名をカスタマイズできます

重要: この@synthesizeようにインスタンス変数名を指定せずに使用すると、インスタンス変数
@synthesize firstName;
はプロパティと同じ名前になります。
この例では、インスタンス変数もfirstNameアンダースコアなしで呼び出されます。

それらはほとんど矛盾しているように見えますが、前の段落は自動合成されたインスタンス変数のみを参照してますが、後者は明示的に合成したときに起こることです.

自動合成は、Clang コンパイラ v4 を含むバージョン 4.4 でのみ XCode に導入された、非常に新しい機能です。これに先立って、@synthesizing 変数を先頭のアンダースコア (これは Apple の使用のために予約されているという伝説があります)、末尾のアンダースコア (Google のObjective-C スタイル ガイド) で合成することの長所と短所について無限の議論がありました。XCode 4.4 以降、これは解決されました。すべての iVar に先頭のアンダースコアを付けて明示的に名前を付けますが、コンパイラーに任せておいてください。

更新: Google がスタイル ガイドを更新して、私たちの残りの部分に合うようにしていることに気付きました...

末尾のアンダースコアは、以前はインスタンス変数名に好まれていました。

私たちのスタイル ガイドには、C++ でのメンバー変数の命名と同様に、インスタンス変数の名前の末尾にアンダースコアを付ける必要があるという規則がありました。これは、より広範な Objective-C コミュニティとの一貫性を保ち、Apple の公式ガイドラインによりよく従い、自動インスタンス変数合成などの新しいコンパイラ機能を使用できるようにするために、先頭のアンダースコアに変更されました。新しいプロジェクトでは、先頭にアンダースコアを使用することを強くお勧めします。既存のプロジェクトでは、残りのコードベースとの一貫性を維持するために、新しいコードで末尾のアンダースコアを引き続き使用できます。

于 2013-01-31T00:11:59.937 に答える
1

あなたは正しいです(そしてあなたの教授はそうではありません)。@synthesize変数名が指定されていない場合、プロパティと同じ名前のivarを作成します。

@synthesize foo;

...という名前のivarを作成しますfoo

于 2013-01-31T00:02:16.343 に答える