这是我面临的问题:我正在使用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
以避免错误。有人可以解释原因吗?
由于
答案 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; }
如果你有一个方法返回一些但有一个属性的方法是一个捷径。