当我重写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