0

何かが _textColor 変数に格納されているときに呼び出されるセッター モジュールを作成しましたが、機能しません。新しいセッター モジュールを削除し、シンセサイザーにデフォルトのものを作成させると、デフォルトのものは機能します。これの問題は、「fillColor」という変数があると、setFillColor という別のモジュールにアクセスしてしまうことです。

無関係なコードの大部分を省略しました。ヘッダー ファイルには次のものがあります。

@interface ICADrawingObject : NSObject <NSCoding> {
@private
    NSColor                 *_textColor;
}
@property (nonatomic, retain, readwrite, setter=setObjectTextColor:) NSColor* textColor;

実装では、私は持っています:

@synthesize textColor = _textColor;

-(void)setObjectTextColor:(NSColor *)textColor{
    NSLog(@"Text Old Color: %@",self.textColor);
    NSLog(@"Text New Color: %@",textColor);

    _textColor = textColor;
}
4

2 に答える 2

0

これはどう:

@interface ICADrawingObject : NSObject {
    NSColor *_textColor;
}
@property (nonatomic, retain, setter=setObjectTextColor:) NSColor *textColor;
@end

@implementation ICADrawingObject
@synthesize textColor = _textColor;

-(void)setObjectTextColor:(NSColor *)aColor{
    NSLog(@"Text Old Color: %@",_textColor);
    NSLog(@"Text New Color: %@",aColor);
    if( _textColor != aColor ) {
        [_textColor release];
        _textColor = [aColor retain];
    }
    _textColor = aColor;
}

@end

その後、これを行うと:

ICADrawingObject *obj = [ICADrawingObject new];
obj.textColor = [NSColor blackColor];

次に、カスタム セッターが呼び出されている証拠として、これがコンソールに出力されます。

2012-09-19 08:37:43.605 test323[67540:303] Text Old Color: (null)
2012-09-19 08:37:43.606 test323[67540:303] Text New Color: NSCalibratedWhiteColorSpace 0 1

ちなみに@privateivarの指定は不要です。実装で ivar を宣言することにより、可視性を制御できるようになりました。

于 2012-09-19T13:40:00.873 に答える
0

次のようになります。

 -(void)setTextColor:(NSColor *)textColor{
    if (_textColor != textColor) {
    [_textColor release];
    _textColor = [textColor retain];

 }
于 2012-09-19T12:58:23.103 に答える