2

重複の可能性:
getter および setter でプロパティが機能しない

これは私が直面している問題です:私はiOS 6を使用しています.ヘッダーファイルでプロパティを宣言します:

@property (nonatomic) CGFloat scale;

次に、実装で、次のように独自のゲッター/セッターを作成します。

#define DEFAULT_SCALE 0.90    

- (void)setScale:(CGFloat)scale
{
    if(_scale != scale) {
        _scale = scale;
        [self setNeedsDisplay];
    }
}

- (CGFloat) scale
{
    if(!_scale) {
        return DEFAULT_SCALE;
    } else {
        return _scale;
    }
}

問題は、_scale がコンパイラによって認識されないことです。「宣言されていない識別子 '_scale' の使用」というエラーが表示されます。ゲッターまたはセッターを削除すると正常に動作しますが、両方を保持することはできません。削除する場合は@synthesize scale = _scale、エラーを回避するために追加する必要があります。誰かが説明できますかなぜ?

ありがとう

4

2 に答える 2

6

@interface独自のセッター/ゲッターを使用する場合は、でインスタンス変数を宣言する必要があります。

@interface MyClass : NSObject
{
    CGFloat _scale;
}
...
@end

編集(OP質問の後):

あなたの特定の実装は確かに違いを生みます(それらは副作用として何かをするので、それらは単純なゲッター/セッターメソッドではありません)。ただし、ランタイムは自動宣言されたインスタンス変数をサポートしていないため、変数を宣言することは常に良い考えであり、32ビットOSXをターゲットにする場合は絶対に必要です。

于 2012-12-12T15:42:25.207 に答える
1

完全な実装 (getter と setter) を提供する場合、コンパイラは ivar は必要ないと想定するため、ivar が必要な場合は自分で作成する必要があります。ivar を作成するか、@synthesize に任せてください。最終結果は同じです (ivar が作成されます)。唯一の違いは、最初のケースでは、実際に好きなように呼び出すことができることです。

少し違うが関連している

@property (nonatomic,readonly) SomeThing* something;

メソッドを提供する

- (Something*) something { return xxxxxx; }

何かを返すメソッドがあるが、プロパティを持つことがショートカットである場合。

于 2012-12-12T19:20:46.717 に答える