所以我有一个名为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,但为什么会这样呢?
答案 0 :(得分:16)
属性实际上只是语法糖。所以当你声明一个像你这样的属性时:
@property (strong, nonatomic) NSMutableString *description;
自动合成。含义:如果你不提供自己的getter + setter(参见borrrden的答案),就会创建一个实例变量(默认情况下它的名称为“underscore + propertyName”)。 getter + setter根据您提供的属性描述(强大,非原子)合成。 因此,当您获取/设置属性时,它实际上等于调用getter或seter。所以
self.description;
等于[self description]
。
并且
self.description = myMutableString;
等于[self setDescription: myMutableString];
因此,当你像你一样定义一个setter时:
-(void)setDescription:(NSMutableString *)description
{
self.description = description;
}
它导致无限循环,因为self.description = description;
调用[self setDescription:description];
。
答案 1 :(得分:10)
1)NSObject
已经有一个名为description的方法。选择其他名称
2)你的二传手是一个无限循环
但是关于你的实际问题:如果不覆盖这两种方法,编译器只会自动生成后备变量。
P.S。不,你不能仅仅使用self.description而不是#34;因为那时你的吸气剂也将是一个无限循环。