20

新しい Objective-C コンパイラを使用すると、プロパティを合成する必要がなくなることがわかりました。2 つのクラスを含む 1 つのファイルがあります。単純なヘルパー クラスの .h は次のようになります。

@interface ViewFrameModel : NSObject

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

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

@end

私の他のクラス (クラス 2)​​ の同じ .h ファイルには、次のものがあります。

@property (nonatomic, strong) ViewFrameModel *viewFrameModel;

クラス 2.m では、次のことができます。

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

これは、コンパイラからの苦情なしで正常に動作しますが、これを追加すると:

- (ViewFrameModel *)viewFrameModel {
    return _viewFrameModel;
}

最初の方法に 1 つずつ、2 つの苦情がありますsetViewFrameModel

"宣言されていない識別子 _viewFrameModel の使用、viewFrameModel のことですか"

そしてもう一方は戻り_viewFrameModelます:

「宣言されていない識別子 _viewFrameModel の使用、viewFrameModel のことですか」 「囲んでいるコンテキストで宣言されたローカル変数 viewFrameModel への参照」

を追加するとこれらのエラーが発生するのはなぜですか

- (ViewFrameModel *)viewFrameModel {
    return _viewFrameModel;
}

方法?このメソッドをいくつかのカスタム情報でオーバーライドしたいのですが、それは私に不平を言っています:-. 考え?ティア。

4

3 に答える 3

34

セッターとゲッターの両方をオーバーライドすると、コンパイラはインスタンス変数を自動的に作成しなくなります。次のようにクラスの実装に追加できます。

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

昨年行ったいくつかのテストの結果は次のとおりです。 ivar を作成せずに iOS 自動 @synthesize

つまり、@synthesize を使用するか、iVar を明示的に宣言する必要があります。

于 2013-01-08T20:15:59.023 に答える