XCode 4.5.2错误使用属性时未使用的变量

时间:2013-10-14 19:11:18

标签: objective-c xcode properties

我已宣布该财产:

@property(弱,非原子)IBOutlet UILabel * statusLabel;

然后我像这样使用它: statusLabel.text = plainText; 要么 [statusLabel setText plainText];

在这两种情况下,我都遇到编译器错误“使用未声明的标识符'statusLabel';你的意思是 _statusLabel? “”。实际上,当我用_statusLabel替换statusLabel时,编译器很高兴。

我完全不解。 1.是的,XCode会自动合成_statusLabel,但我正在尝试使用属性,而不是实例变量。为什么财产不可见?

  1. 使用。(点)与ivar是错误的,据我所知,dot是属性。为什么又一次?

  2. 如果我手动指定合成没有下划线的var,代码可以工作,但同样,它意味着编译器使用变量而不是属性。

  3. 所以,这个组合有效: @synthesize statusLabel = statusLabel; ... [statusLabel setText:plainText];

    而这不是: @synthesize statusLabel = _statusLabel; ... [statusLabel setText:plainText];

    有人解释一下吗?非常感谢。 哔叽

4 个答案:

答案 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;