在Modern Objective-C中覆盖setter和getter时访问生成的ivars时出错

Cry*_*tal 19 properties objective-c getter-setter ios

我现在知道新的Objective-C编译器让你不再需要合成你的属性了.我有一个文件,里面有两个类.我的.h是一个简单的帮助类,如下所示:

@interface ViewFrameModel : NSObject

@property (nonatomic, strong) UIView *view;
@property (nonatomic, assign) CGRect frame;

- (id)initWithView:(UIView *)view frame:(CGRect)frame;

@end
Run Code Online (Sandbox Code Playgroud)

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

@property (nonatomic, strong) ViewFrameModel *viewFrameModel;
Run Code Online (Sandbox Code Playgroud)

在2.m级,我可以这样做:

- (void)setViewFrameModel:(ViewFrameModel *)viewFrameModel {
    _viewFrameModel = viewFrameModel;        
    [self pushViewFrameModel:viewFrameModel];
}
Run Code Online (Sandbox Code Playgroud)

这很好,没有编译器的抱怨,但是,当我添加这个:

- (ViewFrameModel *)viewFrameModel {
    return _viewFrameModel;
}
Run Code Online (Sandbox Code Playgroud)

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

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

而另一个回归_viewFrameModel:

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

为什么我在添加时会出现这些错误

- (ViewFrameModel *)viewFrameModel {
    return _viewFrameModel;
}
Run Code Online (Sandbox Code Playgroud)

方法?我想用一些自定义信息覆盖这个方法,但它在抱怨我: - .思考?TIA.

Car*_*zey 34

如果同时覆盖setter和getter,编译器将不再为您自动创建实例变量.您可以将其添加到类实现中,如下所示:

@implementation ClassName {
    ViewFrameModel *_viewFrameModel;
}
...
@end
Run Code Online (Sandbox Code Playgroud)


Jef*_*mas 6

以下是我去年做过的一些测试的结果:iOS自动@synthesize而没有创建一个ivar.

简而言之,您需要使用@synthesize或明确声明iVar.