8

したがって、次のように定義された description という名前の NSString プロパティがあります。

@property (strong, nonatomic) NSMutableString *description;

次のように、ゲッターを定義するときに _description として参照できます。

- (NSString *)description
{
    return _description;
}

ただし、セッターを定義すると、次のようになります。

-(void)setDescription:(NSMutableString *)description
{
    self.description = description;
}

前述の getter (宣言されていない識別子) から _description を分割します。おそらく代わりに self.description を使用できることはわかっていますが、なぜこれが起こるのでしょうか?

4

2 に答える 2

16

@borrrdenの答えはとても良いです。詳細を追加したいだけです。

プロパティは、実際には単なる構文糖衣です。したがって、次のようにプロパティを宣言すると:

@property (strong, nonatomic) NSMutableString *description;

自動合成されます。意味:独自のゲッターとセッターを提供しない場合(borrrdenの回答を参照)、インスタンス変数が作成されます(デフォルトでは、名前は「アンダースコア+プロパティ名」です)。また、getter + setter は、指定したプロパティの説明に従って合成されます (strong、nonatomic)。したがって、プロパティを取得/設定するときは、実際にはゲッターまたはセッターを呼び出すことと同じです。そう

self.description;

に等しい[self description]です。と

self.description = myMutableString;

に等しい[self setDescription: myMutableString];

したがって、あなたがしたようにセッターを定義すると:

-(void)setDescription:(NSMutableString *)description
{
    self.description = description;
}

self.description = description;を呼び出すため、無限ループが発生します[self setDescription:description];

于 2013-06-10T05:09:49.540 に答える
10

1)NSObjectすでに説明という名前のメソッドがあります。別の名前を選ぶ

2) セッターは無限ループです

しかし、実際の質問に関しては、両方のメソッドをオーバーライドしない場合、コンパイラはバッキング変数のみを自動生成します。

PS いいえ、ゲッターも無限ループになるため、「代わりに self.description を使用する」ことはできません。

于 2013-06-10T05:02:01.163 に答える