2

可能重复:
属性不适用于 getter AND setter

这是我面临的问题:我使用的是 iOS 6。我在头文件中声明了一个属性:

@property (nonatomic) CGFloat scale;

然后在实现中,我创建自己的 getter/setter,如下所示:

#define DEFAULT_SCALE 0.90    

- (void)setScale:(CGFloat)scale
{
    if(_scale != scale) {
        _scale = scale;
        [self setNeedsDisplay];
    }
}

- (CGFloat) scale
{
    if(!_scale) {
        return DEFAULT_SCALE;
    } else {
        return _scale;
    }
}

问题是编译器无法识别 _scale。我收到错误“使用未声明的标识符'_scale'。如果我删除了getter或setter,那么它工作正常,但我不能同时保留两者。如果我这样做,我必须添加@synthesize scale = _scale以避免错误。有人可以解释为什么?

谢谢

4

2 回答 2

6

@interface如果要使用自己的 setter/getter ,则需要在 中声明实例变量:

@interface MyClass : NSObject
{
    CGFloat _scale;
}
...
@end

编辑(在 OP 问题之后):

您的特定实现肯定会有所作为(它们不是简单的 getter/setter 方法,因为它们会产生副作用)。但是,我认为声明变量总是一个好主意,如果您想针对 32 位 OSX,则绝对有必要,因为运行时不支持自动声明的实例变量。

于 2012-12-12T15:42:25.207 回答
1

如果您提供完整的实现(getter 和 setter),编译器会假定您不需要 ivar,因此如果您仍然想要一个,则必须自己创建一个。要么制作一个 ivar,要么让 @synthesize 为你做。最终结果是一样的(创建了一个 ivar);唯一的区别是在第一种情况下,您实际上可以随意调用它。

略有不同但相关 我经常有一个

@property (nonatomic,readonly) SomeThing* something;

并提供方法

- (Something*) something { return xxxxxx; }

对于您有一个返回某些内容但具有属性的方法的情况是一种快捷方式。

于 2012-12-12T19:20:46.717 回答