1

timeSignature などの整数変数を .h ファイルで宣言し、setter/getter メソッドのペアを合成しました。

.h:

@interface Metronome : NSObject {
    int timeSignature;
}
@property (nonatomic) int timeSignature;

.m:

@synthesize timeSignature;

セッターメソッドをオーバーライドしたい: ユーザーが新しい値を設定すると、新しい値に変更するだけでなく、何か他のことを行います:

- (void) setTimeSignature:(int)timeSignature {
    self.timeSignature = timeSignature; //hides instance variable warning at this line
    [self doesSomethingElse];
}

問題は、ローカル変数とインスタンス変数が同じ名前になっていることです。

どうすればこれを回避できますか?

4

4 に答える 4

6

引数変数名を変更します。

- (void) setTimeSignature:(int)newTimeSignature { 
    timeSignature = newTimeSignature; //hides instance variable warning at this line 
    [self doesSomethingElse]; 
} 

また、setter 内からプロパティを使用しないでください。これにより、無限ループが作成されます。self.timeSignature = setTimeSignature を呼び出します!

これは、プロパティのバッキング ivar としてアンダースコア名 (_timeSignature) を使用する理由の 1 つです。

于 2012-04-25T07:28:56.400 に答える
5

ivar_timeSignatureに名前を付けて作成します@synthesize timeSignature = _timeSignature;

于 2012-04-25T07:28:35.500 に答える
1

パラメータの名前を変更します。aTimeSignatureまたはを使用しますnewTimeSignature

また、これはより大きな問題です。

self.timeSignature = someVar;

単なるシンタックスシュガーです

[self setTimeSignature: somevar];

ドット表記は、プロパティがセッターとは異なると誤解させます。これは真実ではありません。プロパティセッターとゲッターです。あなたが本当に持っているのはこれです:

- (void) setTimeSignature:(int)timeSignature {
    [self setTimeSignature: timeSignature]; //hides instance variable warning at this line
    [self doesSomethingElse];
}

表記を変更すると、明らかな難しさがわかるはずです。

Objective-Cを初めて使用する場合は、ドット表記を完全に理解できるようになるまで、ドット表記を避ける必要があります(これは、iOSプログラミングに関するBig Nerd Ranchガイドのアドバイスです)。

于 2012-04-25T07:55:18.727 に答える
1

メソッド パラメータの名前を変更するだけで問題が解決するはずです。また、実際に setter メソッドを再度呼び出すと、コードは無限再帰を生成します。プロパティ呼び出しも削除する必要があります。

- (void) setTimeSignature:(int)timeSignature_ {
    timeSignature = timeSignature_; //hides instance variable warning at this line
    [self doesSomethingElse];
}
于 2012-04-25T07:28:19.020 に答える