如果宣布我自己的吸气剂并且iVar不被认可二传手

时间:2012-12-12 15:38:52

标签: objective-c ios ios6

  

可能重复:
  property not working with 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'。 如果我取下吸气剂或固定器,那么它工作正常,但我不能同时保持两者。如果我这样做,我必须添加@synthesize scale = _scale以避免错误。有人可以解释原因吗?

由于

2 个答案:

答案 0 :(得分:6)

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

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

编辑(在OP问题之后):

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

答案 1 :(得分:1)

如果你提供一个完整的实现(getter和setter),编译器假定你不需要一个ivar,所以如果你还需要一个,你必须自己创建一个。要么制作一个伊娃,要么让@synthesize为你做。最终结果是相同的(创建了一个ivar);唯一的区别是在第一种情况下你可以随意调用它。

略有不同但相关我经常有

@property (nonatomic,readonly) SomeThing* something;

并提供方法

- (Something*) something { return xxxxxx; }

如果你有一个方法返回一些但有一个属性的方法是一个捷径。