8

所以我有一个名为 description 的 NSString 属性,定义如下:

@property (strong, nonatomic) NSMutableString *description;

当我定义 getter 时,我可以将其称为 _description,如下所示:

- (NSString *)description
{
    return _description;
}

但是,当我定义一个 setter 时,如下所示:

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

它从前面提到的 getter(未声明的标识符)中打破了 _description。我知道我可能只使用 self.description 代替,但为什么会发生这种情况?

4

2 回答 2

16

@borrrden 的回答非常好。我只是想补充一些细节。

属性实际上只是语法糖。所以当你像你一样声明一个属性时:

@property (strong, nonatomic) NSMutableString *description;

它是自动合成的。这意味着:如果您不提供自己的 getter + setter(请参阅 borrrden 的答案),则会创建一个实例变量(默认情况下,它的名称为“下划线 + propertyName”)。并且 getter + setter 根据您提供的属性描述(强,非原子)合成。所以当你获取/设置属性的时候,其实就等于调用getter或者setter。所以

self.description;

等于[self description]。和

self.description = myMutableString;

等于[self setDescription: myMutableString];

因此,当您像以前那样定义 setter 时:

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

它会导致无限循环,因为self.description = description;调用[self setDescription:description];.

于 2013-06-10T05:09:49.540 回答
10

1)NSObject已经有一个名为 description 的方法。选择另一个名字

2)你的设置器是一个无限循环

但至于您的实际问题:如果您不覆盖这两种方法,编译器只会自动生成支持变量。

PS不,你不能只是“使用self.description”,因为那样你的getter也将是一个无限循环。

于 2013-06-10T05:02:01.163 回答