Error accessing generated ivars when I override setters and getters in Modern Objective-C

一个人想着一个人 提交于 2019-11-30 14:42:28

问题


I know now the new Objective-C compiler lets you not need to synthesize your properties anymore. I have one file that has two classes in it. My .h for a simple helper class looks like this:

@interface ViewFrameModel : NSObject

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

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

@end

In the same .h file, for my other class (class 2), I have:

@property (nonatomic, strong) ViewFrameModel *viewFrameModel;

In class 2.m, I can do this:

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

This works fine with no complaints from the compiler, however, when I add this:

- (ViewFrameModel *)viewFrameModel {
    return _viewFrameModel;
}

I get two complaints, one on the first method setViewFrameModel:

"Use of undeclared identifier _viewFrameModel, did you mean viewFrameModel"

And the other on return _viewFrameModel:

"Use of undeclared identifier _viewFrameModel, did you mean viewFrameModel" "Reference to local variable viewFrameModel' declared in enclosing context"

Why do I get these errors when I add in the

- (ViewFrameModel *)viewFrameModel {
    return _viewFrameModel;
}

method? I want to override this method with some custom info, but it's complaining at me :-. Thoughts? TIA.


回答1:


If you override both the setter and the getter, the compiler will not automatically create the instance variable for you anymore. You can add it to your class implementation like so:

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



回答2:


Here is the results of some testing I did last year: iOS automatic @synthesize without creating an ivar.

In short, you need to use @synthesize or declare an iVar explicitly.




回答3:


To summarize the answers:

If you override both the setter and the getter, the compiler will not create the instance variable for you.

Why? In that case, the compiler assumes that the property is dynamic: that it might be a property that relies on other properties for storage / computation, or that it will be created in other ways, for example, at runtime using Objective-C runtime functions.

To help the compiler understand the situation better there are two potential solutions:

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

or

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


来源:https://stackoverflow.com/questions/14223137/error-accessing-generated-ivars-when-i-override-setters-and-getters-in-modern-ob

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!