20

我现在知道新的 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 文件中,对于我的其他类(2 类),我有:

@property (nonatomic, strong) ViewFrameModel *viewFrameModel;

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

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

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

- (ViewFrameModel *)viewFrameModel {
    return _viewFrameModel;
}

我收到两个投诉,一个是关于第一种方法的setViewFrameModel

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

另一个返回_viewFrameModel

“使用未声明的标识符 _viewFrameModel,您的意思是 viewFrameModel” “对封闭上下文中声明的局部变量 viewFrameModel' 的引用”

为什么我在添加时会收到这些错误

- (ViewFrameModel *)viewFrameModel {
    return _viewFrameModel;
}

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

4

3 回答 3

34

如果同时覆盖 setter 和 getter,编译器将不再自动为您创建实例变量。您可以像这样将它添加到您的类实现中:

@implementation ClassName {
    ViewFrameModel *_viewFrameModel;
}
...
@end
于 2013-01-08T20:09:44.950 回答
5

这是我去年做的一些测试的结果:iOS 自动 @synthesize 没有创建 ivar

简而言之,您需要使用 @synthesize 或显式声明 iVar。

于 2013-01-08T20:15:59.023 回答
3

总结一下答案:

如果您同时覆盖 setter 和 getter,编译器将不会为您创建实例变量。

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

为了帮助编译器更好地理解这种情况,有两种可能的解决方案:

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

或者

@implementation Class {
    PropertyClass *_property;
}
...
@end
于 2017-05-02T14:17:29.017 回答