当我重写Modern Objective-C中的setter和getters时,错误地访问生成的ivars

我现在知道新的Objective-C编译器可以让你不再需要综合你的属性。 我有一个文件,它有两个类。 我的.h为一个简单的助手类看起来像这样:

@interface ViewFrameModel : NSObject @property (nonatomic, strong) UIView *view; @property (nonatomic, assign) CGRect frame; - (id)initWithView:(UIView *)view frame:(CGRect)frame; @end 

在同一个.h文件中,对于我的其他类(class 2),我有:

 @property (nonatomic, strong) ViewFrameModel *viewFrameModel; 

在2.mclass,我可以这样做:

 - (void)setViewFrameModel:(ViewFrameModel *)viewFrameModel { _viewFrameModel = viewFrameModel; [self pushViewFrameModel:viewFrameModel]; } 

这工作正常,没有来自编译器的投诉,但是,当我添加这个:

 - (ViewFrameModel *)viewFrameModel { return _viewFrameModel; } 

我得到两个投诉,第一个方法setViewFrameModel

“使用未声明的标识符_viewFrameModel,你的意思是viewFrameModel”

而另一个返回_viewFrameModel

“使用未声明的标识符_viewFrameModel,你的意思是viewFrameModel”“引用局部variablesviewFrameModel”在封闭的上下文中声明“

为什么我在添加时遇到这些错误?

 - (ViewFrameModel *)viewFrameModel { return _viewFrameModel; } 

方法? 我想用一些自定义信息来覆盖这个方法,但是这是在抱怨我: – 。 思考? TIA。

如果你重写setter和getter,编译器将不会自动为你创build实例variables。 您可以将它添加到您的类实现中,如下所示:

 @implementation ClassName { ViewFrameModel *_viewFrameModel; } ... @end 

下面是去年我做的一些testing的结果: iOS自动化@synthesize而不创build伊娃 。

总之,你需要使用@synthesize或者明确声明一个iVar。

总结答案:

如果你重写setter和getter,编译器将不会为你创build实例variables。

为什么? 在这种情况下,编译器假定该属性是dynamic的:它可能是一个依赖其他属性进行存储/计算的属性,或者是以其他方式创build的属性,例如,在运行时使用Objective-C运行时函数。

为了帮助编译器更好地理解情况,有两个可能的解决scheme:

 @implementation Class { @synthesize property = _property; ... @end 

要么

 @implementation Class { PropertyClass *_property; } ... @end