【问题标题】:Setter methods not being called未调用 Setter 方法
【发布时间】:2012-09-19 12:53:47
【问题描述】:

我创建了一个 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;
}

【问题讨论】:

  • 只是好奇,你为什么要更改 setter 的名称?这是极其罕见的,并且可能会破坏 KVC 的某些部分(我没有测试过,因为这是一件不寻常的事情)。有时我们会更改 getter 的名称(特别是布尔值),但几乎不会更改 setter 的名称。
  • 请注意,如果您直接访问您的 ivars,则无法运行方法。所以当你说“当任何东西被存储到_textColor 变量中时”,这是不可能的。您应该在任何地方使用访问器(除了 init 和 dealloc)。如果纯粹是为了调试,你可以使用 LLDB“观察点”来观察内存何时发生变化。但是,当您在没有访问器的情况下更改 ivar 时,您无法使代码运行。
  • Tbh,我想尝试让 setter 工作,部分原因是为了节省我的工作,而且由于我的同事在整个代码中使用变量名,这会导致很多问题。进一步查看代码,我发现很多问题都是由于绑定到 xib 文件中的变量而发生的,我认为最好的办法就是重命名变量并确保一切安全
  • 这不是真的“iphone”和“osx”,是吗?它可能与您的问题无关,但使用正确的标签意味着您会得到正确回答者的注意。

标签: iphone objective-c macos


【解决方案1】:

应该是这样的:

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

 }

【讨论】:

  • 那使用默认方法,我需要让它使用setObjectTextColor:方法
【解决方案2】:

这个怎么样:

@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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多