0

これは純粋に理論的な質問です。

変数varXを持つクラスがあります。この変数を変更するメソッドがあります。Xcode、オートコンプリートの提案:

-(void)setVarX:(float)varX;

実装では、インスタンスメソッドを作成すると、Xcodeは警告を表示します。

「'varX'のローカル宣言はインスタンス変数を非表示にします」

方法:

-(void)setVarX:(float)varX {

    varX = varX;

}

そこで、解決するために、合成でアンダースコアを使用しました。

@synthesize varX = _varX;

方法は次のとおりです。

-(void)setVarX:(float)varX {

    _varX = varX;

}

このように変数の前にアンダースコアを使用するのは適切ですか?それ以外の場合、Xcodeによって提案されたメソッドの名前をどのように使用しますか?

ありがとう

4

3 に答える 3

2

使用_varXするのが正しいアプローチです。この行を省略した場合@synthesize(Xcode 4.4以降)、その名前のインスタンス変数が自動的に生成されます。

于 2012-08-06T15:59:57.280 に答える
1

Xcode 4.4(およびそれ以降)@synthesizeでは、を使用しない場合にプロパティが自動的に合成されます(これはもう必要ありません)@dynamic。自動合成ではアンダースコアが使用されるため、Appleはこれを慣例にしたいと考えているようです。

最初はこのアイデアが嫌いでしたが、今ではなぜそれが便利なのかがわかりました。これらのプロパティの変数名は、他のメソッドでは「予約」されなくなりました(他の状況ではアンダースコアを使用しません)。

于 2012-08-06T15:59:46.640 に答える
0

インスタンス変数名を変更するとクラスが効果的に変更されますが、メソッド引数名を変更しても変更されないことに注意してください。

したがって、私はそれを逆にすることを好みます:

-(void)setVarX:(float)_varX {

varX = _varX;

}

そのため、外部から見えるクラスのインターフェースの一部であるインスタンス変数名を変更する必要はありません。

于 2012-08-09T08:30:24.863 に答える