13

私はプロパティを定義しました...

@property (nonatomic, strong) NSArray *eventTypes;

ゲッターとセッターをオーバーライドしたい...

私はこれを書いた...

- (void)setEventTypes:(NSArray *)eventTypes
{
    _eventTypes = eventTypes;

    //do some stuff here.
}

これはうまくいきますが、これを追加すると...

- (NSArray*)eventTypes
{
    //do some stuff here.

    return _eventTypes;
}

次に、両方の関数でエラーが表示され、_eventTypes が何であるかがわかりません。

これはどちらでも同じです。1 つの機能で動作しますが、他の機能を追加するとすぐに両方とも失敗します。

これのために他に何かする必要がありますか?両方ではなくどちらか一方のボットで機能するのは奇妙に思えます。

4

4 に答える 4

20

LLVM はバッキング ivar (デフォルトではアンダースコアがプレフィックス) を自動合成しますが、ゲッター メソッドとセッター メソッドの両方を実装する場合、自動合成された ivar を取得できない@synthesize eventTypes = _eventTypes;ため、手動で行う必要があります。

詳細については、こちらをご覧ください: http://useyourloaf.com/blog/2012/08/01/property-synthesis-with-xcode-4-dot-4.html

于 2012-12-11T10:13:48.797 に答える
2

これを追加@implementation

@synthesize eventTypes = _eventTypes;
于 2012-12-11T10:08:36.747 に答える
1

プロパティを @synthesize する必要があります。次のようなカスタムのゲッターとセッターを作成するときに使用します。

  • カスタム getter と setter を使用した読み取り/書き込みプロパティ。
  • カスタム getter を持つ ReadOnly プロパティ。

.m ファイルの@implementationの直後に、次を追加します。

@synthesize propertyName = _propertyName;

これは、その特定のプロパティのメソッド「get」および「set」の制御を取得する必要があることをコンパイラに伝えます。その後、set と get の実装は正常に機能します。


追加の説明:

self.anyString = @"TEXT" ; [self setAnyString:@"TEXT"];とまったく同じです。これらは両方ともメソッドセットを呼び出しています。_anyStringを使用すると、set メソッドを介さずにプロパティに直接アクセスできます。

そのため、set メソッド内でself.propertyを呼び出すと、無限ループが発生します。メソッド「set」と「get」を書き直したら、 selfの代わりに_を使用する必要があります。.

于 2016-04-27T13:27:52.603 に答える
-8

これを試してください:

- (void)setEventTypes:(NSArray *)eventTypes
{
    self.eventTypes = eventTypes;

    //do some stuff here.
}
- (NSArray*)eventTypes
{
    //do some stuff here.

    return self.eventTypes;
}
于 2012-12-11T13:34:55.413 に答える