0

我创建了一个 setter 模块,当将任何内容存储到 _textColor 变量中但它不起作用时应该调用它,如果我删除新的 setter 模块并让合成器创建默认模块,那么默认模块将起作用。问题在于,当我有一个名为“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

它会是这样的:

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

 }
于 2012-09-19T12:58:23.103 回答
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

顺便说一句,没有必要@private在 ivars 上指定。您现在可以通过在实现中声明 ivars 来控制可见性。

于 2012-09-19T13:40:00.873 回答