-1

Mac OS X(Hillegass)用のCocoaプログラミングでは、第19章にクラスがあります。

@interface BigLetterView : NSView {
NSColor *bgColor;
}
@property (strong) NSColor *bgColor;
@end

アクセサは次のように定義されます。

- (void)setBgColor:(NSColor *)c {
bgColor = c;
[self setNeedsDisplay:YES]; }

これは私には正しいように見えましたが、無限ループを作成します:bgColor = c呼び出しsetBgColor:c

このコードは正しいですか?

セッターを再定義する方法は?このコードをコンパイルするには何が必要ですか?

4

2 に答える 2

0

このようにすると、見た目がすっきりし、理解しやすくなります。

@interface BigLetterView : NSView
@property (strong) NSColor *bgColor;
@end
@implementation BigLetterView

- (void)setBgColor:(NSColor *)c {
_bgColor = c;
[self setNeedsDisplay:YES]; 
}

また、他の場所でプロパティを使用する場合は、常に自分自身でプロパティを使用するという簡単なルールを作成します。物事を明確に理解させるためのより良いルールです。

于 2012-11-25T21:37:31.620 に答える
0

最新のXcode/llvmでは、コードを少しクリーンアップできます。

つまり、メンバー変数をバッキング変数として宣言する必要も、合成ステートメントを宣言する必要もありません。

自分自身を合成することを宣言しない場合、プロパティfooにはバッキング変数があります_foo

したがって、このコードは機能するはずです

@interface BigLetterView : NSView 
@property (nonatomic, strong) NSColor *bgColor;
@end

@implementation BigLetterView
@synthesize bgColor = _bgColor;

- (void)setBgColor:(NSColor *)c 
{
    _bgColor = c;
    [self setNeedsDisplay:YES]; 
}
@end
于 2012-11-25T21:51:08.427 に答える