2

@propertyとについて学んでいるとき、私は何かを試していました@synthesize@propertyインスタンス変数を@synthesize作成し、そのゲッター メソッドとセッター メソッドを作成したと思います。

#import <Foundation/Foundation.h>

@interface XYPoint : NSObject 
@property int x, y;

-(void) setX: (int) xVar andY: (int) yVar;

@end

x実装ファイルでとを合成しませんでしyたが、なぜ両方を実行できるのか疑問に思っていました。

-(void) setX:(int)x {
    x = x;
}

-(void) setY:(int)y {
    y = y;
}

しかし、宣言されていない識別子に関するエラーメッセージが表示されxyこれを行ったときに:

-(void) setX:(int)xVar andY:(int)yVar {
    x = xVar;
    y = yVar;
}

また、インターフェイス ファイルで宣言しなかったのはなぜ-(void) setY:(int)yですか。-(void) setX:(int)x

4

2 に答える 2

2

@propertyがインスタンス変数を作成し、@synthesizeがそのためのgettersメソッドとsettersメソッドを作成したと思いました。

これは完全には正しくありません。宣言は@property基本的に他のクラスに約束するだけです:「あなたは私にint名前を尋ねることができます、そして私は私にその名前で保存xするための試みにも応えます。」int宣言自体は、メソッドまたはivarのいずれかをクラスに作成しません。

それはそれらの両方@synthesizeを行うことです。独自のsetter、getter、およびivarを自分で実装することも、それらを合成することもできます(または任意の組み合わせ)。

したがって、使用しないときにエラーが発生する理由@synthesizeは、ivarが作成されていないため、クラス内で使用できる名前xではないためです。y

最初のケースでは、自分がしていると思われることをしていません。この方法では:

-(void) setX:(int)x {
    x = x;
}

xはパラメータの名前であり、それ自体に割り当てるだけです。(同じスコープ内に同じ名前の2つの変数を含めることはできません。という名前のivar作成した場合、ivarxをシャドウイングするメソッドパラメーターについてコンパイラー警告が表示されます。つまり、パラメーター名が同じであることを意味します。 ivarとして、ivarにアクセスすることはできません。)

これを次のように変更した場合:

-(void) setX:(int)newX {
    x = newX;
}

x宣言されていない場合も同じエラーが表示されます。

また、なぜインターフェイスファイルで宣言しなかった-(void) setY:(int)y-(void) setX:(int)xでしょうか。

それらは@propertyディレクティブによって宣言されます。

于 2012-05-26T20:33:25.307 に答える
0

パラメータ変数にすでに持っている値を割り当てているだけのように見えます。パラメータ名を変更すると、何が起こっているのかがより理にかなっている可能性があります。

-(void) setX:(int)xVar {
    x = xVar;
}

-(void) setY:(int)yVar {
    y = yVar;
}

その場合、エラーメッセージは一貫しているはずです。

于 2012-05-26T20:32:25.383 に答える