我已宣布该财产:
@property(弱,非原子)IBOutlet UILabel * statusLabel;
然后我像这样使用它: statusLabel.text = plainText; 要么 [statusLabel setText plainText];
在这两种情况下,我都遇到编译器错误“使用未声明的标识符'statusLabel';你的意思是 _statusLabel? “”。实际上,当我用_statusLabel替换statusLabel时,编译器很高兴。
我完全不解。 1.是的,XCode会自动合成_statusLabel,但我正在尝试使用属性,而不是实例变量。为什么财产不可见?
使用。(点)与ivar是错误的,据我所知,dot是属性。为什么又一次?
如果我手动指定合成没有下划线的var,代码可以工作,但同样,它意味着编译器使用变量而不是属性。
所以,这个组合有效: @synthesize statusLabel = statusLabel; ... [statusLabel setText:plainText];
而这不是: @synthesize statusLabel = _statusLabel; ... [statusLabel setText:plainText];
有人解释一下吗?非常感谢。 哔叽
答案 0 :(得分:1)
如果你没有合成一个变量,你只能通过它自动合成的_variable属性或self.variable来访问它。
否则你可以合成它。
将它用作_statusLabel
并没有错。没关系。
您也可以使用self.statusLabel
代替_statusLabel
您可以阅读@synthesize here
的内容答案 1 :(得分:1)
@property (weak, nonatomic) IBOutlet UILabel *statusLabel;
将生成一个名为setStatusLabel的setter,以及一个getter statusLabel和一个_statusLabel。当你使用self和“。”时,将没有名为statusLabel的变量。语法你真的在调用setter / getter而不是直接访问变量。例如,如果您需要覆盖属性的setter,则需要直接使用该变量,这样就不会创建一个不定式的递归循环。
// NOTE: WRONG! recursive infinitive loop
- (void)setStatusLabel:(UILabel *)label
{
self.statusLabel = label;
}
// RIGHT way (in regards to avoiding infinitive recursion)
- (void)setStatusLabel:(UILabel *)label
{
_statusLabel = label;
}
self.statusLabel = @"";
[self setStatusLabel:[[UILabel alloc] init]];
_statusLabel = [[UILabel alloc] init];
UILabel *label = self.statusLabel;
UILabel *label = [self statusLabel];
UILabel *label = _statusLabel;
如果您决定同步属性,则可以覆盖变量名称:
@syntersize statusLabel = myVarName;
您可以像这样覆盖setter / getter名称:
@property(nonatomic,weak,setter = mySetter,get = myGet)IBOutlet UILabel * statusLabel;
此外,如果你决定像这样同步属性: @syntersize statusLabel; 生成的变量没有“_”。
虽然我认为没有理由更改setter / getter或变量名的默认名称......
答案 2 :(得分:0)
如果您允许xcode自动合成属性,那么您需要将其称为self.statuslabel
。
答案 3 :(得分:0)
感谢您的解释,正如我现在所理解的,这些是有效的访问方式(前3个属于属性,后2个 - 直接ivar):
[[self statusLabel] setText:plainText];
[self.statusLabel setText: plainText];
self.statusLabel.text = plainText;
[_statusLabel setText:plainText];
_statusLabel.text = plainText;