1

@propertyaと@synthesizeそれを宣言するときは、以下を使用することをお勧めします。

@synthesize myProperty = _myProperty;

_myPropertyXcodeは、ソースコードでまだ使用されていなくても、ivar名をオートコンプリートすることに気づきました。

これは、ivar@synthesizeが自動的にデフォルトの名前を作成するため_myPropertyですか?それとも、Xcodeがこの一般的な規則をオートコンプリートでサポートしているからですか?

ありがとう。

編集:私はこれが良い習慣である理由を探していません。私はすでにそれらを知っており、しばらくの間この規則を使用しています。内部を理解したいので、これが規則を満たすためのハードコードされたオートコンプリートルールなのか、それとも標準のオートコンプリートなのか、そして実際にObjective-C仕様では、によって生成されたivar@synthesizeにフォーム_myProperty、したがって、ivarの舞台裏での生成後、オートコンプリートはその存在を認識します。ありがとう!

4

4 に答える 4

2

オートコンプリートは、ランタイムの結果ではなく、IDEの利便性だと思います。これに対する私の論理は、以下が有効であるように見えるということです:

@interface SomeClass()
@property (nonatomic, assign) int unpublishedInstanceVariable;
@end

@implementation SomeClass
@synthesize unpublishedInstanceVariable;

- (void)someMethod
{
    unpublishedInstanceVariable = 3; // not calling the setter
}
@end
于 2011-10-12T14:29:59.567 に答える
1

Xcode 4.4の時点で、テールに新しいひねりがあります(sic)。

  • @synthesizeこれで、完全にスキップできるようになりました。この場合、コンパイラー@synthesize foo = _foo;は、インスタンス変数名の前にアンダースコアを付けて、宣言を自動的に生成します。

@interface Foo : NSObject
@property (nonatomic, copy) NSString *foo;
@end

@implementation Foo
- (void)bar {
    NSLog(@"%@", _foo); // this Works!
}   
@end
  • ただし、明示的な@synthesizeステートメントがあり、インスタンス変数の名前を指定しない場合、インスタンス変数のデフォルト名はプロパティの名前と同じです。つまり、アンダースコアが前に付けられていません。この場合、@Tommyの回答は引き続き保持します。

誰かがこの振る舞いを文書化した公式のAppleDocsへのリンクを指摘できれば素晴らしいと思います。

アップデート

私の調査結果は的確でした。この動作(@synthesizeデフォルトであり、明示的な合成などがない場合にバッキングアンダースコアプレフィックス付きインスタンス変数を作成する)は、WWDC2012セッション405-ModernObjective-Cで公開されました。

于 2012-09-04T04:38:35.327 に答える
1

規則を満たすためにハードコードされたオートコンプリートルール

iVar名を明示的に指定しない場合、それはと呼ばれmyPropertyます。オートコンプリートはコンパイラとは何の関係もありません。Xcodeが非常に役立つだけです。

于 2011-10-12T14:29:15.213 に答える
0

あなたの質問のこの部分について:

...実際にObjective-C仕様で、@synthesizeによって生成されたivarの形式は_myPropertyである必要があるかどうか。

ivarには任意の名前を付けることができます。ドキュメントから:

次のように、property = ivarの形式を使用して、特定のインスタンス変数をプロパティに使用する必要があることを示すことができます。

@synthesize firstName, lastName, age=yearsOld; 

これは、firstName、lastName、およびageのアクセサーメソッドを合成する必要があり、プロパティageがインスタンス変数yearsOldで表されることを指定します。

また、

@synthesizeディレクティブは、他に宣言されていない場合は、適切なインスタンス変数も合成します。

于 2012-09-04T17:36:44.497 に答える